首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 錯誤 8525 分散式交易已完成:BizTalk SQL Adapter 呼叫含交易預存程序的根因與 TRY/CATCH 解決方案

     編輯:關於SqlServer

錯誤背景

環境:Windows Server 2003 Ent + SP2、SQL Server 2005 Ent + SP2、BizTalk Server 2006 Ent (異機部署、非網域、MSDTC 設定「不要求驗證」)。BizTalk Orchestration (長期交易) 呼叫 SQL Adapter 存取含 BEGIN TRAN 的預存程序,拋出:分散式交易已完成。請將此會話登記到新交易或 NULL 交易中 (MSSQLSERVER_8525)。

錯誤觸發四條件 (MSDN)

  1. 應用程式已登記分散式交易
  2. 該交易已結束 (Commit/Rollback)
  3. 應用程式未顯式脫離或登記新分散式交易
  4. 應用程式嘗試執行脫離現有分散式交易範圍的操作 (查詢、本地交易等)

根因分析

  • BizTalk 發起分散式交易 (MSDTC 協調)
  • 預存程序內部另開 BEGIN TRAN (本地交易) → 成為巢狀交易
  • 發生 Deadlock → Rollback 所有交易
  • 外層分散式交易已結束,但程式碼繼續執行 (如 FOR XML 回傳) → 觸發 8525

解決方案:SQL Server 2005 TRY/CATCH 取代舊式錯誤處理

BEGIN TRY
    BEGIN TRANSACTION;
    -- 更新/插入/刪除陳述式
    COMMIT TRANSACTION;
    SET @ReturnValue = '01';
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
    -- 記錄錯誤資訊
    SET @ReturnValue = '99';
END CATCH;

-- 統一回傳 XML
SELECT Code AS ReturnValue FROM ManifestStatus WHERE Code = @ReturnValue FOR XML AUTO, ELEMENTS;

效果與殘留問題

  • 單筆處理不再出現 8525
  • 併發測試仍發現 Deadlock Rollback,可能其他陳述式寫法有問題,需進一步調優

最佳實務建議

  • 預存程序避免在 BizTalk 分散式交易內開啟本地交易,改用 TRY/CATCH 管理錯誤
  • 若必須本地交易,確保 XACT_ABORT ON 並正確處理巢狀層級
  • 統一錯誤碼回傳機制,避免混合結果集與錯誤處理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved