2012-09-19 99 views
0

在一般情況下,我只是希望能夠做到這一點:嵌套事務,履行回滾

begin transaction 
begin transaction 
select 'x' 
rollback 
rollback 

的原因是,我有一個代碼存儲的過程是這樣的:

begin transaction 

--Do stuff 

If(problem) 
begin 
    rollback 
end else begin 
    commit 
end 

它就像我想要的那樣工作,但我想通過這樣做來測試它:

begin transaction 
exec MyStoredProc 
rollback 

當存儲的proc執行回滾時,它似乎s來關閉這兩個事務,然後在存儲過程之外回滾失敗。

+2

SQL Server並沒有真正的嵌套事務。當然,你可以將它們嵌入代碼中 - 但最終總是隻有一個事務,如果你將其中一個回滾,那麼所有向外「嵌套」的回滾也會回滾。請參閱[SQL Server數據庫管理員誤解26/30 - 嵌套事務是真實的](http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(2630) - nested-transactions-are-real.aspx)瞭解更多信息。 –

回答

2

在SQL Server中沒有自治事務這樣的事情。嵌套交易有助於增加@@TRANCOUNT,但就是這樣。正如@marc_s在他的評論中建議的那樣,ROLLBACK並不僅僅適用於當前的交易範圍/級別,它適用於整個事情。

這一請求被駁回,2008年:

http://connect.microsoft.com/SQLServer/feedback/details/324569/add-support-for-true-nested-transactions

然而,這一要求仍然有效 - 所以也許有希望:

http://connect.microsoft.com/SQLServer/feedback/details/296870/add-support-for-autonomous-transactions

至於你的外回滾失敗,你可以隨時檢查這個第一,而不是盲目地做,比如:

IF @@TRANCOUNT > 0 
    ROLLBACK TRANSACTION; 
+0

啊,這個工作很好,因爲 開始交易 開始交易 從MyTable的 刪除提交 回滾 不真正刪除任何記錄。根據回滾行爲的方式,我期望它提交兩個事務,然後拋出一個錯誤。 – TizzyFoe