2013-11-14 57 views
1

我一直試圖讓這個工作一段時間。在交易中包裝交易存儲過程

我有一個存儲過程(我們將其稱爲SPA)由另一位開發人員編寫,它將多個插入到數據庫中,並且所有這些插入都包裝在存儲過程中的事務中。我還有另一個不使用事務的存儲過程(稱爲SPB)。

從我的.NET代碼中,我需要在事務中包裝這兩個存儲過程,以確保如果SPB不成功,則會回滾所有SPA。不幸的是,這不適合我。我得到的錯誤是:

無法回滾銷售。沒有找到該名稱的事務或保存點。
EXECUTE後的事務計數表示不匹配的BEGIN和COMMIT語句數。上一個計數= 1,當前計數= 2

我已經證實,ROLLBACKCOMMIT總是被稱爲內SPA飛去。我的.NET代碼非常簡單:

try { 
    conn.Open(); 
    trans = conn.BeginTransaction(); 
    prod.Connection = conn; 
    prod.Transaction = trans; 

    // Execute SPA 
    // Execute SPB 

} catch (Exception ex) { 
    trans.Rollback(); 
} finally { 
    conn.Close(); 
} 

如果我參加.NET的方程,並簡單地使用SSMS來包裝SP一樣,所以我得到了同樣的錯誤消息。

BEGIN TRAN 
DECLARE @return_value int 
EXEC @return_value = [dbo].[spSPA] [...] 
SELECT 'Return Value' = @return_value 
COMMIT TRAN 

任何想法?

編輯:

SPA看起來像:

BEGIN TRY 
BEGIN TRAN SALE 

IF SomeCondition 
    DoSomething 
ELSE 
    ROLLBACK TRAN SALE 
    RETURN 100 

IF SomeCondition 
    DoSomething 
ELSE 
    ROLLBACK TRAN SALE 
    RETURN 200 

... 

COMMIT TRAN SALE 
RETURN 0 

END TRY 
BEGIN CATCH 
    IF XACT_STATE() <> 0 
    ROLLBACK TRAN SALE 
END CATCH 
+0

即使您在SPB中創建新的交易,交易也將被獨立提交或回滾。 – codemonkeh

+0

@codemonkeh我不想在SPB中創建交易,我想要一個外部交易來同時涵蓋SPA和SPB。根據SQL Server中的嵌套事務,內部事務提交(SPA中的)應該被忽略,而我在.NET中的外部事務應該最終提交或回滾所有內容。 – trousyt

+0

啊,你是對的。該錯誤意味着你錯過了一個提交語句。也許你需要在try塊中明確地提交它? – codemonkeh

回答

1

我終於發現我的問題。我收到警告Cannot roll back SALE. No transaction or savepoint of that name was found.,因爲如果您有嵌套事務,則在回滾時必須指定最外層事務的名稱。當然,我不知道那個交易的名字是什麼。

解決方法是使用保存點,如TechNet上所述。因此,我必須進行檢查以查看是否存在現有交易,如果是,請使用保存點。否則,請自行創建:

DECLARE @TRANCOUNT int 
SET @TRANCOUNT = @@TRANCOUNT 

IF @TRANCOUNT = 0 BEGIN TRAN 
ELSE SAVE TRANSACTION SALE