3 回答

TA貢獻1853條經驗 獲得超6個贊
保羅·蘭德爾的文章 誤差266 觸發回滾
解釋:
所有TXN開始和提交/回滾必須配對,以便 @@TRANCOUNT
在出入境時是相同的。 不匹配 @@TRANCOUNT
導致錯誤266,因為 BEGIN TRAN
增量 @@TRANCOUNT
COMMIT
減量 @@TRANCOUNT
ROLLBACK
回報 @@TRANCOUNT
降至零 你不能減少 @@TRANCOUNT
適用于當前范圍 這就是你認為的“內部交易” SET XACT_ABORT ON
取消由不匹配引起的錯誤266。 @@TRANCOUNT
也處理像這樣的問題 “SQLServer事務超時” 日照 這允許客戶端txns(如LINQ),單個存儲過程可能是分布式或XA事務的一部分,或者僅僅是在客戶端代碼(比如.NET TransactionScope)中啟動的一個存儲過程。
用法:
每個存儲的proc必須符合相同的模板。
摘要
所以不要創建比你需要的更多的txn
密碼
CREATE PROCEDURE [Name]ASSET XACT_ABORT, NOCOUNT ONDECLARE @starttrancount intBEGIN TRY SELECT @starttrancount = @@TRANCOUNT IF @starttrancount = 0 BEGIN TRANSACTION [...Perform work, call nested procedures...] IF @starttrancount = 0 COMMIT TRANSACTIONEND TRYBEGIN CATCH IF XACT_STATE() <> 0 AND @starttrancount = 0 ROLLBACK TRANSACTION; THROW; --before SQL Server 2012 use --RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]END CATCH GO
注:
回滾檢查實際上是多余的,因為 SET XACT_ABORT ON
..然而,它讓我感覺更好,看上去很奇怪沒有,并考慮到一些情況下,你不想要它。

TA貢獻1780條經驗 獲得超1個贊
為了解決返回@AlexKuznetsov所提到的錯誤號和行號的問題,可以這樣引發錯誤:
DECLARE @ErrorMessage NVARCHAR(4000)
DECLARE @ErrorSeverity INT
DECLARE @ErrorState INT
DECLARE @ErrorLine INT
DECLARE @ErrorNumber INT
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorNumber = ERROR_NUMBER(),
@ErrorLine = ERROR_LINE()
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorNumber, @ErrorLine)
- 3 回答
- 0 關注
- 493 瀏覽
添加回答
舉報