我有一個存儲過程,需要設置一個保存點,以便它可以,在某些情況下,撤消它所做的一切,並返回一個錯誤代碼給調用者,或接受/提交併將成功返回給調用者。但是,無論呼叫者是否已經開始交易,我都需要它。該文件在這個問題上非常混亂。這是我認爲會起作用的,但我不確定所有的後果。SAVE TRANSACTION vs BEGIN TRANSACTION(SQL Server)如何嵌套事務很好
東西是 - 這個Stored Procedure (SP)
被別人調用。所以我不知道他們是否已經開始交易...即使我要求用戶開始交易以使用我的SP,我仍然有關於正確使用Save Points
的問題...
我的SP將測試交易是否正在進行,如果沒有,請從BEGIN TRANSACTION
開始。如果一個交易已經在進行中,它將會創建一個保存點,並且保存這個事實,這就是我所做的。
然後如果我必須回滾我的更改,如果我早些時候做了BEGIN TRANSACTION
,那麼我會ROLLBACK TRANSACTION
。如果我做了保存點,那麼我會ROLLBACK TRANSACTION MySavePointName
。這種情況似乎很好。
這裏我有點困惑 - 如果我想保持我所做的工作,如果我開始交易,我將執行COMMIT TRANSACTION
。但是,如果我創建了一個保存點?我試過COMMIT TRANSACTION MySavePointName
,但隨後呼叫者嘗試提交其交易,並得到一個錯誤:
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
所以我不知道那麼 - 保存點可以回滾(即作品:ROLLBACK TRANSACTION MySavePointName
將不會回滾調用者的交易)。但也許人們從不需要「承諾」呢?它只停留在那裏,以防需要回滾到原始事務,但在原始事務被提交(或回滾)後會消失?
如果有一種「更好」的方式來「嵌套」一個交易,請說明一下。我還沒有想出如何嵌套BEGIN TRANSACTION
,但只有回滾或提交我的內部交易。似乎ROLLBACK
將始終回滾到最高交易,而COMMIT
只是遞減@@trancount
。
你發現可能是值得張貼作爲一個答案。 – 2012-03-16 08:49:22
@Andriy好的,那就是我所做的 - 刪除我的編輯並將其用作答案。謝謝。 – 2012-03-16 21:13:22