SQL Server在查询后以静默方式删除事务
SQL Server版本14.0.1000.169 我启动一个事务,执行一个查询列表,但当我尝试执行commit时,出现了错误20018 commit transaction请求没有相应的BEGIN transaction。 在此之前没有错误,并且连接没有中断 因此,我尝试记录每个DML查询,执行SELECT XACT_STATE,在每次执行之前和之后执行。@@TRANCOUNT,下面是我得到的结果: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] =&
[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…谢谢您的回答!事实证明,如果直接运行有问题的查询,它确实会引发异常。无论出于何种原因,它都不会在程序中执行此操作,只会让它运行,但没有会话。