我一直試圖讓這個工作一段時間。在交易中包裝交易存儲過程
我有一個存儲過程(我們將其稱爲SPA
)由另一位開發人員編寫,它將多個插入到數據庫中,並且所有這些插入都包裝在存儲過程中的事務中。我還有另一個不使用事務的存儲過程(稱爲SPB
)。
從我的.NET代碼中,我需要在事務中包裝這兩個存儲過程,以確保如果SPB
不成功,則會回滾所有SPA
。不幸的是,這不適合我。我得到的錯誤是:
無法回滾銷售。沒有找到該名稱的事務或保存點。
EXECUTE後的事務計數表示不匹配的BEGIN和COMMIT語句數。上一個計數= 1,當前計數= 2
我已經證實,ROLLBACK
或COMMIT
總是被稱爲內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
即使您在SPB中創建新的交易,交易也將被獨立提交或回滾。 – codemonkeh
@codemonkeh我不想在SPB中創建交易,我想要一個外部交易來同時涵蓋SPA和SPB。根據SQL Server中的嵌套事務,內部事務提交(SPA中的)應該被忽略,而我在.NET中的外部事務應該最終提交或回滾所有內容。 – trousyt
啊,你是對的。該錯誤意味着你錯過了一個提交語句。也許你需要在try塊中明確地提交它? – codemonkeh