SQL事务自提交
我正在事务中运行以下SQL更新查询,以便在提交之前检查结果。然而,在执行并回滚之后,我发现它已经提交了,并且我的数据已经更改,尽管从未发出commit语句SQL事务自提交,sql,tsql,transactions,commit,Sql,Tsql,Transactions,Commit,我正在事务中运行以下SQL更新查询,以便在提交之前检查结果。然而,在执行并回滚之后,我发现它已经提交了,并且我的数据已经更改,尽管从未发出commit语句 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 =
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
我的语句格式正确,没有丢失任何重要数据,但我想知道为什么会发生这种情况,以便将来不会遇到问题。SQL Server角色退出,自动提交模式默认设置为true 是如何关闭它的,下面是有关此功能的一些附加细节:
BEGIN TRAN Test
修改为ROLLBACK TRAN Test
,而不是将ROLLBACK
附加到事务的末尾,如下所示:
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
,然后在该查询的末尾追加了一个额外的查询。我还完成了其他可以回滚的事务。为什么有些能工作而其他不能?从您的第一个链接来看,我的开始
应该覆盖自动提交<代码>SQL Server连接在自动提交模式下运行,直到BEGIN TRANSACTION语句启动显式事务,或隐式事务模式设置为on代码>哦,等等。。。我知道我做了什么。我没有将ROLLBACK TRAN Test
放在我的SQL查询的末尾,而是将BEGIN
替换为ROLLBACK
,因此它有效地回滚了我以前的事务,就好像我附加了命令一样,然后在ROLLBACK
行之后继续执行整个查询。