SQL Server之分布式事務

2021-08-24 21:36:29 字數 4300 閱讀 3431

--> title : sql server之分布式事務

--> author : wufeng4552

--> date : 2009-11-11

sql server之分布式事務

(一)概念:

分布式事務是涉及來自兩個或多個源的資源的事務。microsoft® sql server™ 2000支援分布式事務,使使用者得以建立事務來更新多個sql server資料庫和其它資料來源。

分布式事務包括:

·資源管理器

控制分布式事務所涉及的每個資源的軟體稱為資源管理器。分布式事務由各個資源管理器內的本地事務組成。每個資源管理器必須能夠與分布式事務內的所有其它資源管理器相協調,以提交或回滾自己的本地事務。sql server 可以作為分布式事務內的資源管理器工作,並遵從用於分布式事務處理的x/open xa 規範。

·事務管理器

提交或回滾分布式事務由稱為事務管理器的軟體元件控制。事務管理器與每個資源管理器相協調,確保一起提交或回滾所有組成分布式事務的本地事務。microsoft分布式事務處理協調器(ms dtc) 服務如事務管理器一樣工作。ms dtc 遵從用於分布式事務處理的x/open xa 規範。

·兩階段提交(2pc)

需要進行特殊的提交處理,以防止在管理跨越多個資源管理器的事務時出現問題。當重新整理日誌緩衝區使其可用時,提交大事務可能需要相對較長的時間。提交程序本身還可能遇到錯誤,需要強行回滾。如果事務管理器只是請求每個資源管理器提交,則可能從一些資源管理器返回成功狀態,然後從某個資源管理器得到錯誤資訊。這會導致衝突,因為所有分布式事務都應回滾,而部分事務已提交。兩階段提交通過將提交分成兩相可以解決此問題:

·準備事務管理器給每個資源管理器傳送乙個準備提交的請求。然後,每個資源管理器執行完成提交程序所需的所有大量占用資源的操作,如重新整理所有日誌緩衝區。資源管理器只保留維護事務完整性所需的最少的鎖,然後給事務管理器返回成功狀態。

·提交如果所有資源管理對發給它們的準備請求返回成功狀態,事務管理器將給每個資源管理器傳送提交命令。然後,每個資源管理器快速將事務記錄為已完成,並釋放上次控制的資源。如果有任何資源管理器對準備請求返回錯誤資訊,事務管理器將給每個資源管理器傳送回滾命令。

有幾種方法可以使應用程式在分布式事務內包括sql server 2000:

·如果應用程式有本地事務並且發出分布式查詢,本地事務將公升級到分布式事務。

·發出begin distributed transaction 語句。

·如果應用程式有本地事務並且將remote_proc_transactions 選項設定為on,則呼叫遠端儲存過程將使本地事務公升級到分布式事務。

·使用用於sql server 的ole db 提供程式或sql server odbc 驅動程式的應用程式,可以使用ole db 方法或odbc 函式讓sql server 連線聯接由應用程式啟動的分布式事務。

(二)案例

(2.1)問題描述

在執行分布式事務時,在sql server 2005下收到如下錯誤:

訊息7391,級別16,狀態2,過程***xx,第16 行

無法執行該操作,因為鏈結伺服器"***xx" 的ole db 訪問介面"sqlncli" 無法啟動分布式事務。

在sql server 2000下收到如下錯誤:

該操作未能執行,因為ole db 提供程式'sqloledb' 無法啟動分布式事務。

[ole/db provider returned message: 新事務不能登記到指定的事務處理器中。]

ole db 錯誤跟蹤[ole/db provider 'sqloledb' itransactionjoin::jointransaction returned 0x8004d00a]。

(2.2)解決方案

(2.2.1)雙方啟動msdtc服務

msdtc服務提供分布式事務服務,如果要在資料庫中使用分布式事務,必須在參與的雙方伺服器啟動msdtc(distributed transaction coordinator)服務。

(2.2.2)

開啟雙方135埠

msdtc服務依賴於rpc(remote procedure call (rpc))服務,rpc使用135埠,保證rpc服務啟動,如果伺服器有防火牆,保證135埠不被防火牆擋住。使用「telnet ip 135 」

命令測試對方埠是否對外開放。也可用埠掃瞄軟體(比如advanced port scanner

)掃瞄埠以判斷埠是否開放。

(2.2.3)保證鏈結伺服器中語句沒有訪問發起事務伺服器的操作

在發起事務的伺服器執行鏈結伺服器上的查詢、檢視或儲存過程中含有訪問發起事務伺服器的操作,這樣的操作叫做環迴(loopback),是不被支援的,所以要保證在鏈結伺服器中不存在此類操作。

(2.2.4)在事務開始前加入set xact_abort on語句

對於大多數ole db 提供程式(包括sql server),必須將隱式或顯示事務中的資料修改語句中的xact_abort 設定為on。唯一不需要該選項的情況是在提供程式支援巢狀事務時。

(2.2.5)msdtc設定

管理工具―元件服務―計算機―我的電腦(右鍵)―msdtc―安全配置

在安全配置視窗中做如下設定:

(2.2.5.1)選中「網路dtc訪問」

(2.2.5.2)在客戶端管理中選中「允許遠端客戶端」「允許遠端管理」

(2.2.5.3)在事務管理通訊中選「允許入站」「允許出站」「不要求進行證」 (2.2.5.4)

保證dtc登陸賬戶為:

nt authority\networkservice

(2.2.6)鏈結伺服器和名稱解析問題

建立鏈結sql server伺服器,通常有兩種情況:

第一種情況,產品選」sql server」

exec

sp_addlinkedserver

@server=

'linkservername',

@srvproduct = n'sql server'

這種情況@server(linkservername)就是要鏈結的sqlserver伺服器名或者ip位址。

第二種情況訪問介面選「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服務只通過伺服器名位址訪問鏈結伺服器,所以要保證資料庫引擎和dtc都能通過伺服器名或者ip位址訪問到鏈結伺服器。

資料庫引擎和dtc解析伺服器的方式不太一樣,下面分別敘述

資料庫引擎

第一種情況的@server或者第二種情況的@datasrc設定為ip位址時,資料庫引擎會根據ip位址訪問鏈結伺服器,這時不需要做名稱解析。

第一種情況的@server或者第二種情況的@datasrc設定為sql server伺服器名時,需要做名稱解析,就是把伺服器名解析為ip位址。

有兩個辦法解析伺服器名:

一是在sql server客戶端配置中設定乙個別名,將上面的伺服器名對應到鏈結伺服器的ip位址。

二是在「c:\windows\system32\drivers\etc\hosts」檔案中增加一條記錄:

***.***.***.*** 伺服器名

作用同樣是把伺服器名對應到鏈結伺服器的ip位址。

dtc不管哪一種情況,只要@server設定的是伺服器名而不是ip位址,就需要進行名稱解析,辦法同上面第二種辦法,在hosts檔案中增加解析記錄,上面的第一種辦法對dtc不起作用。

如果@server設定的是ip位址,同樣不需要做網域名稱解析工作

(2.2.7)遠端伺服器上的名稱解析

分布式事務的參與伺服器是需要相互訪問的,發起查詢的伺服器要根據機器名或ip查詢遠端伺服器的,同樣遠端伺服器也要查詢發起伺服器,遠端伺服器通過發起伺服器的機器名查詢伺服器,所以要保證遠端伺服器能夠通過發起伺服器的機器名訪問到發起伺服器。一般的,兩個伺服器在同一網段機器名能就行很好的解析,但是也不保證都能很好的解析,所以比較保險的做法是:在遠端伺服器的在「c:\windows\system32\drivers\etc\hosts」檔案中增加一條記錄:***.***.***.*** 發起伺服器名

SQL Server之分布式事務

title sql server之分布式事務 author wufeng4552 date 2009 11 11 sql server之分布式事務 一 概念 分布式事務是涉及來自兩個或多個源的資源的事務。microsoft sql server 2000支援分布式事務,使使用者得以建立事務來更新多個...

分布式之分布式事務

被人問到分布式事務,之前學rabbitmq 的時候學到過rabbitmq 高階的事務,因為沒有用過,所有沒有回答好。這裡總結一下。1.單機版事務。事務的四大特性 acid a.原子性 b.一致性 c.隔離性 d.永續性 單機事務可以通過設定事務的隔離級別 參見spring 的事務隔離級別 2.分布式...

sqlserver分布式事務

啟動服務中的distributed transaction coodinator後 建立鏈結伺服器ender pc subx 設定連線伺服器rpc out 以及rpc屬性為true 實驗一下 建立表 create table dbo yuf id uniqueidentifier not null,...