2011-01-06 74 views
6

如果我有一個存儲過程用不同的參數多次執行另一個存儲過程,是否有可能讓每個調用獨立於其他調用提交?如何確保嵌套事務獨立於對方提交?

換句話說,如果嵌套過程的前兩次執行成功,但第三次執行失敗,是否可以保留前兩次執行的結果(而不是將它們回滾)?

我有一個存儲過程定義是這樣的SQL Server 2000中:

CREATE PROCEDURE toplevel_proc .. 
AS 
BEGIN 

     ... 

     while @row_count <= @max_rows 
    begin 
     select @parameter ... where rownum = @row_count 
     exec nested_proc @parameter 
     select @row_count = @row_count + 1 
    end 

END 

回答

3

從BOL:

回滾事務未經 savepoint_name或transaction_name 輥回 事務的開始。在嵌套 事務時,此同樣的語句 將所有內部事務回滾到 最外面的BEGIN TRANSACTION 語句。

我還發現從另一個線程here如下:

要知道,SQL Server事務 是不是真的嵌套在你 也許會覺得礙事。一旦開始交易 ,則後續的 BEGIN TRAN會遞增@@ TRANCOUNT ,而COMMIT遞減該值。 當COMMIT導致 歸零@@ TRANCOUNT時,整個最外面的事務是 。但沒有保存點的ROLLBACK 會回滾所有 工作,包括最外面的 事務。

如果您需要嵌套事務 行爲,你需要使用SAVE TRANSACTION而不是BEGIN TRAN和 使用ROLLBACK TRAN的[savepoint_name] 而不是ROLLBACK TRAN。

所以它可能會出現。

+1

「使用ROLLBACK TRAN而不是ROLLBACK TRAN」? – Greg 2011-03-09 07:03:15