SQL Server在查询后以静默方式删除事务

SQL Server在查询后以静默方式删除事务,sql,sql-server,transactions,Sql,Sql Server,Transactions,SQL Server版本14.0.1000.169 我启动一个事务,执行一个查询列表,但当我尝试执行commit时,出现了错误20018 commit transaction请求没有相应的BEGIN transaction。 在此之前没有错误,并且连接没有中断 因此,我尝试记录每个DML查询,执行SELECT XACT_STATE,在每次执行之前和之后执行。@@TRANCOUNT,下面是我得到的结果: [XACT_STATE()] => 0 [@@TRANCOUNT] =&

SQL Server版本14.0.1000.169

我启动一个事务,执行一个查询列表,但当我尝试执行commit时,出现了错误20018 commit transaction请求没有相应的BEGIN transaction。 在此之前没有错误,并且连接没有中断

因此,我尝试记录每个DML查询,执行SELECT XACT_STATE,在每次执行之前和之后执行。@@TRANCOUNT,下面是我得到的结果:

    [XACT_STATE()] => 0
    [@@TRANCOUNT] => 0
-----------------------
BEGIN TRAN
-----------------------
    [XACT_STATE()] => 1
    [@@TRANCOUNT] => 1
-----------------------
<<<Skipped several queries that do no cause the issue>>>
-----------------------
    [XACT_STATE()] => 1
    [@@TRANCOUNT] => 1
-----------------------
SELECT unpvt.productID AS ProductID,
       t.[Index] AS ImageSequence,
       unpvt.Image AS ImageFileName
INTO #tempImages
FROM (
         SELECT *
         FROM tProductNewImport pi
         WHERE pi.ProductNewImportInstanceID = :ProductNewImportInstanceID
           AND pi.deleted IS NULL
           AND pi.productID IS NOT NULL
           AND pi.StoreID = :StoreID
     ) pi
         UNPIVOT (Image FOR [Column] IN (f6)) unpvt
         JOIN (VALUES (1, 'f6')) t ([Index], [Column])
              ON t.[Column] = unpvt.[Column];

CREATE UNIQUE NONCLUSTERED INDEX [NonClusteredIndex-c3975d93e8521] ON [dbo].[#tempImages]
(
    [ProductID] ASC,
    [ImageFileName] ASC
);



DELETE tpi FROM dbo.tProductImage tpi
JOIN #tempImages i on tpi.ProductID = i.ProductID
WHERE tpi.StoreID = :StoreID
AND NOT EXISTS (SELECT * FROM #tempImages i2 WHERE tpi.ProductID = i2.ProductID and tpi.ImageFileName = i2.ImageFileName);


UPDATE tpi
SET ImageSequence = i.ImageSequence * 10
FROM dbo.tProductImage tpi
JOIN #tempImages i on tpi.ProductID = i.ProductID and tpi.ImageFileName = i.ImageFileName
WHERE tpi.StoreID = :StoreID;


INSERT INTO tProductImage (StoreID, ProductID, ImageSequence, ImageFileName)
SELECT :StoreID, i.ProductID, i.ImageSequence * 10, i.ImageFileName
FROM #tempImages i
WHERE NOT EXISTS (SELECT * FROM dbo.tProductImage tpi WHERE tpi.StoreID=:StoreID AND tpi.ProductID=i.ProductID AND tpi.ImageFileName=i.ImageFileName);
-----------------------
    [XACT_STATE()] => 0
    [@@TRANCOUNT] => 0
最后一个是包含多个语句的单个查询。 事务在此之后消失,没有任何明确的“end transaction”语句。
我唯一的猜测是“create index”命令以某种方式执行了提交,但我找不到任何相关信息。

请使用以下模板:

SET NOCOUNT, XACT_ABORT ON;

BEGIN TRY;
            
    BEGIN TRANSACTION;

    --

        /* your code goes here */

    --

    COMMIT TRANSACTION;

END TRY
BEGIN CATCH

    IF @@TRANCOUNT > 0
    BEGIN;
        ROLLBACK TRANSACTION;
    END;

    THROW;

END CATCH;

SET NOCOUNT, XACT_ABORT OFF;
索引创建不会影响as:

BEGIN TRANSACTION语句将@TRANCOUNT递增1。回降 事务将@@TRANCOUNT递减为0,回滚除外 事务保存点\u名称,它不影响@TRANCOUNT。犯罪 事务或提交工作减量@@TRANCOUNT减1

我不确定您是如何执行代码的,以及为什么不返回错误。如果您对索引创建进行了注释,并且错误消失了,那么可能您有重复的值,并且您正在尝试创建唯一的索引


使用模板并让我知道结果。

sql server不会自动删除事务。您的代码中有一个bug…谢谢您的回答!事实证明,如果直接运行有问题的查询,它确实会引发异常。无论出于何种原因,它都不会在程序中执行此操作,只会让它运行,但没有会话。