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

SQL Server 8525 錯誤排查:分散式交易已完成,請登記新交易

     編輯:關於SqlServer

錯誤情境

BizTalk Server 2006 專案使用 SQL Adapter 呼叫預存程序,發生:「分散式交易已完成。請將此會話登記到新交易或 NULL 交易中」。環境:Win Server 2003 Ent + SP2、SQL Server 2005 Ent + SP2、BizTalk 2006 Ent,跨伺服器非網域部署,MSDTC 設「不要求驗證」。

錯誤條件 (MSDN)

  1. 應用程式已登記分散式交易。
  2. 該交易已結束(認可或回滾)。
  3. 應用程式未顯式脫離或登記新分散式交易。
  4. 嘗試執行脫離現有分散式交易以外的操作(查詢、本地交易)。

狀態 1:建立本地交易時;狀態 2:嘗試登記繫結會話時。

根因分析

BizTalk Orchestration 設「長期交易」,呼叫 SQL Adapter 的範圍設「自動交易」。預存程序內部又用 BEGIN TRAN 開啟本地交易,形成巢狀交易。Deadlock 導致全部回滾,觸發 8525。

解決方案

  1. 將預存程序交易控制改用 SQL Server 2005 TRY...CATCH 結構:
BEGIN TRY
    BEGIN TRANSACTION;
    -- 更新語句
    COMMIT TRANSACTION;
    SET @ReturnValue = '01';
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
END CATCH
  1. 最後以 FOR XML AUTO, ELEMENTS 回傳狀態。

單筆資料處理正常,併發仍有死鎖回滾,需進一步優化 SQL 邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved