分散式事務創建註意事項 指定一個由 Transact-SQL 分散式事務處理協調器 (MS DTC) 管理的 Microsoft 分散式事務的起點。 執行 BEGIN DISTRIBUTED TRANSACTION 語句的 SQL Server 資料庫引擎的實例是事務創建者,並控制事務的完成。 當為 ...
分散式事務創建註意事項
指定一個由 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
示例結果: