1. 程式人生 > >SQLServer之建立分散式事務

SQLServer之建立分散式事務

分散式事務建立注意事項

指定一個由 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。

[email protected]_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 @[email protected]+(select @@ROWCOUNT);

insert into testss.dbo.test1(name,sex,height,age,classid) values('分散式事務測試','女','178','20','1');
set @[email protected]+(select @@ROWCOUNT);

if @rowcounts=2
commit transaction distributedtran;
else
rollback transaction distributedtran;
end
go

示例結果: