不允许新事务,因为会话中正在运行其他线程。 SQL SERVER中出错

时间:2016-03-10 06:51:20

标签: sql sql-server sql-server-2008 tsql

我不确定是否有人熟悉此错误。

以下是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不允许新的交易   因为会话中还有其他线程在运行。

但是当我只执行这部分并且没有调用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调用同样的事情就是抛出错误。

愿任何人请帮我解决这个问题。

代码中使用的链接服务器

1 个答案:

答案 0 :(得分:2)

问题出现是因为:

  • 您运行分布式查询(由于使用了链接服务器)。
  • 在您的过程中,
  • XACT_ABORT 设置被设置为 ON

如果只运行查询,则默认情况下 XACT_ABORT 设置为 OFF ,并且不会出现问题。

这是一个简短的article,用于解释详细信息。解决方法是使用:

BEGIN DISTRIBUTED TRANSACTION <Distributed Query> COMMIT TRANSACTION

但是,我个人从未需要使用它。