我在事务中运行以下SQL Update查询,以便在提交之前检查结果。但是,在执行和回滚后,我发现它已经提交,并且我的数据已经改变,尽管从未发出过提交语句。
USE WS_Live
BEGIN TRAN Test
UPDATE AF
SET AF.AdditionalFieldsLookup11 = NULL
OUTPUT inserted.*
FROM dbo.Incident AS I
INNER JOIN dbo.AdditionalFields AS AF
ON AF.Oid = I.AdditionalFields
INNER JOIN dbo.AdditionalFieldsLookup11 AS AFL11
ON AFL11.Oid = AF.AdditionalFieldsLookup11
WHERE AF.AdditionalFieldsLookup11 IS NOT NULL
我的陈述格式正确,我没有丢失任何重要数据,但我想知道为什么会这样,以便我将来不会遇到问题。
答案 0 :(得分:2)
默认情况下,自动提交模式的SQL Server角色设置为true。
Here是关闭它的方法,这里有一个关于此功能的更多细节:
答案 1 :(得分:0)
事实证明,当我尝试回滚原始事务时,SQL正在完成我告诉它的操作。我没有将ROLLBACK
附加到我的交易结束,而是将BEGIN TRAN Test
修改为ROLLBACK TRAN Test
,如下所示:
USE WS_Live
ROLLBACK TRAN Test
UPDATE AF
SET AF.AdditionalFieldsLookup11 = NULL
OUTPUT inserted.*
FROM dbo.Incident AS I
INNER JOIN dbo.AdditionalFields AS AF
ON AF.Oid = I.AdditionalFields
INNER JOIN dbo.AdditionalFieldsLookup11 AS AFL11
ON AFL11.Oid = AF.AdditionalFieldsLookup11
WHERE AF.AdditionalFieldsLookup11 IS NOT NULL
SQL的行为就好像我在前一个查询的末尾附加了ROLLBACK TRAN Test
,然后在其末尾添加了一个额外的查询。