分布式事務創建注意事項
指定一個由 Transact-SQL 分布式事務處理協調器 (MS DTC) 管理的 Microsoft 分布式事務的起點。
執行 BEGIN DISTRIBUTED TRANSACTION 語句的 SQL Server 數據庫引擎的實例是事務創建者,並控制事務的完成。 當為會話發出后續 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 語句時,控制實例請求 MS DTC 在所涉及的所有實例間管理分布式事務的完成。
事務級別的快照隔離不支持分布式事務。
數據庫引擎的遠程實例登記到分布式事務中的主要方法是當已在分布式事務中登記的會話執行引用鏈接服務器的分布式查詢時。
例如,如果在服務器 A 上發出 BEGIN DISTRIBUTED TRANSACTION,則該會話將調用服務器 B 上的一個存儲過程和服務器 C 上的另一個存儲過程。 服務器 C 上的存儲過程執行針對服務器 D 的分布式查詢,這樣該分布式事務將涉及所有四台計算機。 服務器 A 上的 數據庫引擎的實例是該事務的初始控制實例。
Transact-SQL 分布式事務涉及的會話並不獲取可以傳遞給另一個會話的事務對象,從而也不能將其顯式登記在分布式事務中。 遠程服務器登記到事務中的唯一方法是成為分布式查詢或遠程存儲過程調用的目標。
在本地事務中執行分布式查詢時,如果目標 OLE DB 數據源支持 ITransactionLocal,則該事務被自動提升為分布式事務。 如果目標 OLE DB 數據源不支持 ITransactionLocal,則只允許在分布式查詢中執行只讀操作。
已在分布式事務中登記的會話執行一個引用遠程服務器的遠程存儲過程調用。
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。
要求具有 public 角色的成員身份。
使用T-SQL腳本創建分布式事務
語法:
--聲明數據庫引用
use 數據庫名稱;
go
--開啟分布式事務
begin distributed { tran | transaction } [ transaction_name | @tran_name_variable ]
beign
數據庫事務操作;
end
go
語法解析:
--distributed
--分布式事務關鍵字標識符
--transaction_name
--用戶定義的事務名,用於跟蹤 MS DTC 實用工具中的分布式事務。 transaction_name 必須符合標識符規則,字符數必須 <= 32。
--@tran_name_variable
--用戶定義的一個變量名,它含有一個事務名,該事務名用於跟蹤 MS DTC 實用工具中的分布式事務。 必須使用 char、varchar、nchar 或 nvarchar 數據類型聲明該變量。
示例:
--聲明數據庫引用
use testss;
go
--開啟分布式事務
begin distributed transaction distributedtran
begin
declare @rowcounts int =0;
insert into Tests.dbo.test1(name,sex,height,age,classid) values('分布式事務測試','女','178','20','1');
set @rowcounts=@rowcounts+(select @@ROWCOUNT);
insert into testss.dbo.test1(name,sex,height,age,classid) values('分布式事務測試','女','178','20','1');
set @rowcounts=@rowcounts+(select @@ROWCOUNT);
if @rowcounts=2
commit transaction distributedtran;
else
rollback transaction distributedtran;
end
go
示例結果: