3 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
保羅·蘭德?tīng)柕奈恼?/trans> 誤差266 觸發(fā)回滾
解釋?zhuān)?/strong>
所有TXN開(kāi)始和提交/回滾必須配對(duì),以便 @@TRANCOUNT
在出入境時(shí)是相同的。 不匹配 @@TRANCOUNT
導(dǎo)致錯(cuò)誤266,因?yàn)?/trans> BEGIN TRAN
增量 @@TRANCOUNT
COMMIT
減量 @@TRANCOUNT
ROLLBACK
回報(bào) @@TRANCOUNT
降至零 你不能減少 @@TRANCOUNT
適用于當(dāng)前范圍 這就是你認(rèn)為的“內(nèi)部交易” SET XACT_ABORT ON
取消由不匹配引起的錯(cuò)誤266。 @@TRANCOUNT
也處理像這樣的問(wèn)題 “SQLServer事務(wù)超時(shí)” 日照 這允許客戶(hù)端txns(如LINQ),單個(gè)存儲(chǔ)過(guò)程可能是分布式或XA事務(wù)的一部分,或者僅僅是在客戶(hù)端代碼(比如.NET TransactionScope)中啟動(dòng)的一個(gè)存儲(chǔ)過(guò)程。
用法:
每個(gè)存儲(chǔ)的proc必須符合相同的模板。
摘要
所以不要?jiǎng)?chuàng)建比你需要的更多的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
注:
回滾檢查實(shí)際上是多余的,因?yàn)?/trans> SET XACT_ABORT ON
..然而,它讓我感覺(jué)更好,看上去很奇怪沒(méi)有,并考慮到一些情況下,你不想要它。

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
為了解決返回@AlexKuznetsov所提到的錯(cuò)誤號(hào)和行號(hào)的問(wèn)題,可以這樣引發(fā)錯(cuò)誤:
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 關(guān)注
- 483 瀏覽
添加回答
舉報(bào)