2014-09-30 58 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我以前的查詢結束,然後在附加其他查詢那結束了。