分布式查詢和分布式事務
2024-07-21 02:10:54
供稿:網友
microsoft® sql server™ 允許創建與稱為鏈接服務器的 ole db 數據源的鏈接。在鏈接到 ole db 數據源之后,可以:
從 ole db 數據源引用行集,作為 transact-sql 語句中的表。
將命令傳遞給 ole db 數據源,并包含結果行集,作為 transact-sql 語句中的表。 每個分布式查詢都可以引用多個鏈接的服務器,而且可以對每個鏈接的服務器分別執行更新或讀取操作。單個分布式查詢可以對某些鏈接的服務器執行讀取操作,并且對其它鏈接的服務器執行更新操作。通常情況下,每當某個事務可能更新多個鏈接服務器中的數據時,microsoft sql server 都要求相應的 ole db 提供程序支持分布式事務。因此,鏈接服務器上所支持的查詢類型取決于 ole db 提供程序中對事務的支持級別。ole db 為事務管理定義了兩個可選的接口:
itransactionlocal 支持 ole db 數據源中的本地事務。
itransactionjoin 允許提供程序聯結包含其它資源管理器的分布式事務。
所有支持 itransactionjoin 的提供程序也都支持 itransactionlocal。
如果在連接是自動提交模式時執行分布式查詢,則應用以下規則:
對于不支持 itransactionlocal 的提供程序,只允許執行讀取操作。
對于支持 itransactionlocal 的提供程序,允許執行所有更新操作。
主控 sql server 會自動調用每個參與更新操作的鏈接的服務器中的 itransactionlocal,以啟動本地事務,并在語句執行成功時提交或在語句執行失敗時回滾。
如果分布式查詢是針對分布式分區視圖或者是在連接為顯式或隱性事務時執行,則應用下列規則:
對于不支持 itransactionjoin 的提供程序,只允許執行讀取操作。不支持任何事務或只支持 itransactionlocal 的提供程序不能參與更新操作。
如果 set xact_abort 設置為 on,則對于支持 itransactionjoin 的任意提供程序都允許執行所有的更新操作。主控 sql server 會自動調用每個參與更新操作的鏈接服務器中的 itransactionjoin,以便在分布式事務中登記該服務器。然后當主控服務器表示要提交或回滾事務時,ms dtc 將提交或者回滾。
如果 set xact_abort 設置為 off,則鏈接服務器還必須支持嵌套事務,才能對其執行更新操作。當會話已經有一個現有事務時,如果提供程序支持調用 itransactionlocal::starttransaction,則支持嵌套事務。這使 sql server 得以回滾分布式查詢中的單個語句,而不是回滾整個事務。
上述規則意味著提供程序的下列限制不支持嵌套事務:僅在 xact_abort 選項設置為 on 時,分布式事務中才允許更新操作。