2014-09-30 54 views
1

我在事务中运行以下SQL更新查询,以便在提交之前检查结果。但是,在执行和回滚之后,我发现它已经提交并且我的数据已经改变,尽管从未发布提交语句。SQL事务自我承诺

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 

我的声明是正确的格式,我没有丢失任何重要的数据,但我想知道为什么会这样,这样我就不会遇到在未来的问题。

回答

2

默认情况下SQL Server角色自动提交模式设置为true。

Here是如何将其关闭,这里是关于此功能的一些额外的细节:

+0

我已经完成了其他可以回滚的事务。为什么有些人会工作而不是其他人? – NonSecwitter 2014-09-30 18:00:03

+0

从您的第一个链接看来,我的'BEGIN'应该覆盖自动提交。 SQL Server连接以自动提交模式运行,直到BEGIN TRANSACTION语句启动显式事务或设置隐式事务模式为止。 ' – NonSecwitter 2014-09-30 18:02:07

+0

哦,等等......我知道我做了什么。我没有在SQL Query的末尾放置'ROLLBACK TRAN Test',而是用'ROLLBACK'替换了'BEGIN',所以它有效地回滚了我以前的事务,就好像我已经附加了命令一样,然后继续执行整个查询在“ROLLBACK”行之后。 – NonSecwitter 2014-09-30 18:04:22

0

事实证明,SQL在做什么,我告诉它到我试图回滚我原来的交易时。相反追加ROLLBACK我的交易结束的,我修改了BEGIN TRAN TestROLLBACK 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我以前的查询结束,然后在附加其他查询那结束了。