我不确定是否有人熟悉这个错误。
下面是使用了链接服务器的SP。
ALTER PROCEDURE [dbo].[USP_SEMI_NEW_Pepsi]
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
IF OBJECT_ID('dbo.SEMI_NEW_Pepsi', 'U') IS NOT NULL
DROP TABLE dbo.SEMI_NEW_Pepsi;
SELECT
Pepsi.APPID
,Pepsi.Action
,Pepsi.Brand
,ISNULL (BV.BaseID,'') BaseID
,isnull(cast(Pepsi.QuantityID as varchar(150)),'')QuantityID
INTO dbo.SEMI_NEW_Pepsi
FROM
dbo.PREP_NEW_Pepsi Pepsi
LEFT OUTER JOIN linkedserver.dbo.Quantity sub ON sub.QuantityID = Pepsi.SubQuantityID
INNER JOIN linkedserver.dbo.Base BV ON BV.BaseID = Pepsi.BaseID
WHERE CASE WHEN(
(BV.BaseID IS NULL AND Pepsi.BaseID > '')
(sub.QuantityID IS NULL AND Pepsi.QuantityID > '')
END
当我尝试执行此操作时 执行[USP_SEMI_NEW_Pepsi]
我收到如下错误。
Msg 3988, Level 16, State 1, Line 1 New transaction is not allowed because there are other threads running in the session.
但是当我只执行这部分并且不调用 SP 时,我没有收到任何错误。
SELECT
Pepsi.APPID
,Pepsi.Action
,Pepsi.Brand
,ISNULL (BV.BaseID,'') BaseID
,isnull(cast(Pepsi.QuantityID as varchar(150)),'')QuantityID
INTO dbo.SEMI_NEW_Pepsi
FROM
dbo.PREP_NEW_Pepsi Pepsi
LEFT OUTER JOIN linkedserver.dbo.Quantity sub ON sub.QuantityID =Pepsi.SubQuantityID
INNER JOIN linkedserver.dbo.Base BV ON BV.BaseID = Pepsi.BaseID
WHERE CASE WHEN(
(BV.BaseID IS NULL AND Pepsi.BaseID > '')
(sub.QuantityID IS NULL AND Pepsi.QuantityID > '')
这运行得非常好,没有给出任何错误,但是通过 SP 调用同样的事情会抛出错误。
请有人帮我解决这个问题。
代码中使用的链接服务器
最佳答案
出现问题的原因是:
- 您运行分布式查询(由于使用了链接服务器)。
- XACT_ABORT 设置在您的过程中设置为ON。
如果您仅运行查询,则默认情况下XACT_ABORT 设置为OFF,并且不会出现问题。
这是一个简短的article这解释了细节。解决方法是使用:
BEGIN DISTRIBUTED TRANSACTION <Distributed Query> COMMIT TRANSACTION
但是,就我个人而言,我从来不需要使用它。
关于sql - 不允许新事务,因为 session 中还有其他线程正在运行。 SQL Server 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35909519/