BEGIN DISTRIBUTED TRANSACTION
指定一個由 Microsoft 分布式事務處理協調器 (MS DTC) 管理的 Transact-SQL 分布式事務的起始。
語法
BEGIN DISTRIBUTED TRAN [ SACTION ]
[ transaction_name | @tran_name_variable ]
參數
transaction_name
是用戶定義的事務名,用于跟蹤 MS DTC 實用工具中的分布式事務。transaction_name 必須符合標識符規則,但是僅使用頭 32 個字符。
@tran_name_variable
是用戶定義的一個變量名,它含有一個事務名,該事務名用于跟蹤 MS DTC 實用工具中的分布式事務。必須用 char、varchar、nchar 或 nvarchar 數據類型聲明該變量。
注釋
執行 BEGIN DISTRIBUTED TRANSACTION 語句的服務器是事務創建人,并且控制事務的完成。當連接發出后續 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 語句時,主控服務器請求 MS DTC 在所涉及的服務器間管理分布式事務的完成。
有兩個方法可將遠程 SQL 服務器登記在一個分布式事務中:
分布式事務中已登記的連接執行一個遠程存儲過程調用,該調用引用一個遠程服務器。
分布式事務中已登記的連接執行一個分布式查詢,該查詢引用一個遠程服務器。
例如,如果在 ServerA 上發出 BEGIN DISTRIBUTED TRANSACTION,該連接調用 ServerB 上的存儲過程和 ServerC 上的另一個存儲過程,并且 ServerC 上的存儲過程對 ServerD 執行一個分布式查詢,那么四個 SQL 服務器都進入分布式事務中了。ServerA 是該事務的創建者和控制服務器。
分布式事務 Transact-SQL 涉及的連接并不獲取可以傳給另一個連接的事務對象,從而也不能用該方法顯式登記在分布式事務中。遠程服務器登記到事務中的唯一方法是成為遠程存儲過程調用或分布式查詢的目標。
sp_configure remote proc trans 選項控制對本地事務中的遠程存儲過程調用是否自動使本地事務被提升為由 MS DTC 管理的分布式事務。連接層 SET 選項 REMOTE_PROC_TRANSACTIONS 可用于替代由 sp_configure remote proc trans 建立的服務器默認值。啟用本選項后,遠程存儲過程調用會使一個本地事務提升為分布式事務。創建 MS DTC 事務的連接成為該事務的創建人。COMMIT TRANSACTION 初始化一個 MS DTC 協調的提交。如果啟用了 sp_configure remote proc trans 選項,本地事務中的遠程存儲過程調用將被自動保護,成為分布式事務的一部分,而不需要重寫應用程序以便專門使用 BEGIN DISTRIBUTED TRANSACTION 以替代 BEGIN TRANSACTION。
在本地事務中執行一個分布式查詢時,如果目標 OLE DB 數據源支持 ItransactionLocal,則該事務被自動提升為分布式事務。如果目標 OLE DB 數據源不支持 ItransactionLocal,則在分布式查詢中只允許只讀操作。
關于分布式事務環境和處理的更多信息,請參見 Microsoft 分布式事務處理協調器文檔。
權限
默認情況下,任何有效用戶都擁有 BEGIN DISTRIBUTED TRANSACTION 權限。
示例
本例在本地和遠程數據庫上更新作者的姓。本地和遠程數據庫將同時提交或同時回滾本事務。
說明 除非正在運行 Microsoft® SQL Server™ 的計算機上當前裝有 MS DTC,否則本例會產生錯誤信息。關于安裝 MS DTC 的更多信息,請參見 Microsoft 分布式事務處理協調器文檔。
USE pubs
GO
BEGIN DISTRIBUTED TRANSACTION
UPDATE authors
SET au_lname = 'McDonald' WHERE au_id = '409-56-7008'
EXECUTE link_Server_T.pubs.dbo.changeauth_lname '409-56-7008','McDonald'
COMMIT TRAN
GO
Note1:
如果需要連接遠程DB,如果是linkServer 方式連接的話,一定要修該linkServer的 RPC 選項置為True。
Note2:
在由 BEGIN DISTRIBUTED TRANSACTION 顯式啟動或從本地事務升級而來的分布式事務中,不支持 SAVE TRANSACTION。
分布式事務的配置
1. 雙方啟動MSDTC服務
MSDTC服務提供分布式事務服務,如果要在數據庫中使用 SQL Server分布式事務,必須在參與的雙方服務器啟動MSDTC(Distributed Transaction Coordinator)服務。
2. 打開雙方135端口
MSDTC服務依賴于RPC(Remote Procedure Call (RPC))服務,RPC使用135端口,保證RPC服務啟動,如果服務器有防火墻,保證135端口不被防火墻擋住。
使用“telnet IP 135 ”命令測試對方端口是否對外開放。也可用端口掃描軟件(比如Advanced Port Scanner)掃描端口以判斷端口是否開放。
3. 保證鏈接服務器中語句沒有訪問發起事務服務器的操作
在發起事務的服務器執行鏈接服務器上的查詢、視圖或存儲過程中含有訪問發起事務服務器的操作,這樣的操作叫做環回(loopback),是不被支持的,所以要保證在鏈接服務器中不存在此類操作。
4. 在事務開始前加入set xact_abort ON語句
對于大多數 OLE DB 提供程序(包括 SQL Server),必須將隱式或顯示事務中的數據修改語句中的 XACT_ABORT 設置為 ON。唯一不需要該選項的情況是在提供程序支持嵌套事務時。
5. MSDTC設置
打開“管理工具――組件服務”,以此打開“組件服務――計算機”,在“我的電腦”上點擊右鍵。在MSDTC選項卡中,點擊“安全配置”按鈕。
在安全配置窗口中做如下設置:
l 選中“網絡DTC訪問”
l 在客戶端管理中選中“允許遠程客戶端”“允許遠程管理”
l 在事務管理通訊中選“允許入站”“允許出站”“不要求進行驗證”
l 保證DTC登陸賬戶為:NT Authority\NetworkService
6. 鏈接服務器和名稱解析問題
建立鏈接SQL Server服務器,通常有兩種情況:
l 第一種情況,產品選”SQL Server”
EXEC sp_addlinkedserver @server='linkServerName', @srvproduct = N'SQL Server'
這種情況,@server (linkServerName)就是要鏈接的sqlserver服務器名或者ip地址。
l 第二種情況,訪問接口選“Microsoft OLE DB Provider SQL Server”或“Sql Native Client”
EXEC sp_addlinkedserver @server=' linkServerName ', @srvproduct='', @provider='SQLNCLI', @datasrc='sqlServerName'
這種情況,@datasrc(sqlServerName)就是要鏈接的實際sqlserver服務器名或者ip地址。
SQL Server數據庫引擎是通過上面設置的服務器名或者ip地址訪問鏈接服務器,DTC服務也是通過服務器名或者ip地址訪問鏈接服務器,所以要保證數據庫引擎和DTC都能通過服務器名或者ip地址訪問到鏈接服務器。
文章列表