sql - 不允许新事务,因为 session 中还有其他线程正在运行。 SQL Server 中的错误

标签 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 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/

相关文章:

sql - 如何在第三个查询中包含来自其他两个表的过滤行数?

sql-server - ogr2ogr 不创建表

sql - 将可变参数列表传递给 SqlServer2008 存储过程的 Sane/fast 方法

SQL Server 错误 515

sql-server-2008 - 如何在 VSTS DB Edition Deploy 中自定义 CREATE DATABASE 语句?

c# - 复合主键/外键头痛

mysql - SQL如何在分组行中获取表中列的最大值的行

mysql - 如何在具有逗号分隔值的字段上设置 'where' 子句?

mysql - 在数据库中搜索列中具有特定值的所有表

SQL Server比较机制