分散式查詢與分散式交易

SQL Server Database Engine 可讓您建立連結到 OLE DB 資料來源 (稱為連結的伺服器)。連結到 OLE DB 資料來源之後,您可以:

將來自於 OLE DB 資料來源的資料列集,當作 Transact-SQL 陳述式中的資料表來參考。

  • 傳遞命令給 OLE DB 資料來源,並把結果資料列集包含進來當作 Transact-SQL 陳述式中的資料表。

每個分散式查詢皆可參考多個連結的伺服器,並且可對每個個別連結的伺服器執行更新或讀取作業。單一分散式查詢可對某些連結的伺服器執行讀取作業,而同時對其他連結的伺服器執行更新作業。一般而言,在交易中可能會更新來自一或多部連結的伺服器之資料時,Database Engine 便需要取得對應的 OLE DB 提供者對分散式交易的支援。因此,對連結的伺服器執行的查詢類型支援與否,與 OLE DB 提供者對於交易所呈現的支援層級有關。OLE DB 為交易管理定義了兩種選擇性介面:

  • ITransactionLocal 支援 OLE DB 資料來源中的本機交易。

  • ITransactionJoin 讓提供者加入包含其他資源管理員的分散式交易之中。

    支援 ITransactionJoin 的提供者也支援 ITransactionLocal

如果是在連接處於自動認可模式時執行分散式查詢,則適用下列規則:

  • 針對不支援 ItransactionLocal 的提供者,僅允許進行讀取作業。

  • 針對任何支援 ItransactionLocal 的提供者,允許進行所有更新作業。

    在參與更新作業的每個連結的伺服器上,Database Engine 的控制執行個體會自動呼叫 ITransactionLocal,以啟動本機交易。陳述式成功時,它會進行認可,而陳述式失敗時,則會進行回復。

如果分散式查詢是針對分散式資料分割檢視來執行,或是執行於外顯交易或隱含交易的連接時,則適用下列規則:

  • 針對不支援 ItransactionJoin 的提供者,僅允許進行讀取作業。不支援任何交易或僅支援 ITransactionLocal 的提供者,無法參與更新作業。

  • 如果 SET XACT_ABORT 為 ON,則允許對任何支援 ItransactionJoin 的提供者,進行所有更新作業。在參與更新作業的每個連結的伺服器上,Database Engine 的控制執行個體會自動呼叫 ITransactionJoin,將此執行個體註冊到分散式交易。然後,當控制的伺服器指出已認可交易或回復交易時,Microsoft 分散式交易協調器 (MS DTC) 就會認可或回復交易。

  • 如果 SET XACT_ABORT 為 OFF,則允許進行更新作業之前,連結的伺服器也必須支援巢狀交易。如果提供者在工作階段已有現存交易時,且支援呼叫 ITransactionLocal::StartTransaction,便支援巢狀交易。這樣可讓 SQL Server 回復分散式查詢中的個別陳述式,而不需回復整筆交易。

上述規則暗示不支援巢狀交易的提供者適用以下限制:只有在 XACT_ABORT 選項為 ON 時,才能在分散式交易中進行更新作業。

請參閱

概念