BizTalk Server 2006 透過 SQL Adapter 呼叫含交易的預存程序,遇到 MSSQLSERVER_8525:「分散式事務已完成。請將此會話登記到新事務或 NULL 事務中」。本文記錄環境、錯誤觸發條件、根因分析 (巢狀事務 + 死鎖回滾) 與解決方案 (TRY/CATCH 替代舊式交易控制)。
狀態 1 = 建立本地事務時觸發;狀態 2 = 登記綁定會話時觸發。
BEGIN TRAN ... COMMIT/ROLLBACK 開啟本地事務,在 DTO 內形成巢狀事務。CREATE PROC usp_UpdateManifest
@params ...
AS
BEGIN
DECLARE @ReturnValue VARCHAR(2) = '99';
BEGIN TRY
BEGIN TRANSACTION;
-- 更新邏輯
UPDATE ... SET ... WHERE ...;
COMMIT TRANSACTION;
SET @ReturnValue = '01';
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
SET @ReturnValue = '99';
-- 可選:記錄 ERROR_NUMBER/MESSAGE 到日誌表
END CATCH;
-- 統一回傳 XML (無論成敗)
SELECT Code AS ReturnValue FROM ManifestStatus WHERE Code = @ReturnValue
FOR XML AUTO, ELEMENTS;
END;
TRY/CATCH 確保交易要么完整 Commit,要么完整 Rollback,避免半開放狀態。Rollback。MSDN: MSSQLSERVER_8525 | TRY/CATCH