分布式事務已完成。請將此會話登記到新事務或 NULL 事務中


解決方法:

1、查看參與事務范圍中的各相關服務器(譬如中間層服務器、數據庫服務器、可能還有鏈接服務器)的MSDTS的入站、出站選項是否都已設置為“允許”;如下圖

2、數據庫端代碼(通常是存儲過程、觸發器)的開頭是否設置了XACT_ABORT選項,如下代碼:

SET XACT_ABORT ON;

另:關於存儲過程常用的幾個選項用途

SET NOCOUNT ON/OFF:當SET NOCOUNT為ON時,不返回計數(執行完后會返回SQL影響行數),此時將不會;當設置為OFF時,返回計數。 如果存儲過程中包含的SQL語句並不返回許多實際的數據,可以將之設為ON,可以大量減少網絡流量,而可顯著提高性能。

SET XACT_ABORT ON/OFF: 當SET XACT_ABORT為ON時,如果執行Transact-SQL語句出錯時,會立即停止執行,並回滾數據; 當設為OFF時,有時只回滾產生錯誤的SQL語句,而事物將繼續處理,如果錯誤很嚴重,那么即使設置為OFF,也會回滾整個事務,OFF是默認設置。 編輯錯誤或語法錯誤,將不設XACT_ABORT的影響。

對於大多數 OLE DB 訪問接口(包括 SQL Server),必須將隱式或顯示事務中的數據修改語句中的 XACT_ABORT 設置為 ON。唯一不需要該選項的情況是在提供程序支持嵌套事務時。 SET XACT_ABORT 的設置是在執行或運行時設置,而不是在分析時設置。

SET TRANCACTION ISOLATION LEVEL READ UNCOMMITTED/COMMITTED: 此為設置一個事務的隔離級別,一次只能設置一個隔離級別選項,並且始終對那個連接有效,直到顯示更改設置選項。 事務中執行的所有讀取操作都會在指定的隔離級別的規則下運行,除非語句的 FROM 子句中的表提示為表指定了其他鎖定行為或版本控制行為。

當屬性設為UNCOMMITTED時,指定語句可以讀取已有其他事務修改而未提交的行;設置此選項之后,可以讀取未提交的修改,這種讀取稱為臟讀。在事務結束之前,可以更改數據中的值,行也可以出現在數據集中或從數據集中消失。該選項的作用與在事務內所有 SELECT 語句中的所有表上設置 NOLOCK 相同。這是隔離級別中限制最少的級別。 當屬性設為COMMITTED時,指定語句不能讀取已有其他事務修改而未提交的行,這樣可以避免臟讀。其他事務可以在當前事務的各個語句之間更改數據,從而產生不可重復讀取和幻像數據。該選項是 SQL Server 的默認設置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM