Share via


使用繫結工作階段

繫結工作階段可簡化相同伺服器上多個工作階段之間動作的協調作業。繫結工作階段允許兩個以上的工作階段共用相同的交易和鎖定,並且可以使用相同的資料,而不會發生鎖定衝突。繫結工作階段可以從同一個應用程式中的多個工作階段來建立,也可以從擁有個別工作階段的多個應用程式來建立。

若要參與繫結工作階段,工作階段需呼叫 sp_getbindtokensrv_getbindtoken (透過「開放式資料服務」) 來取得繫結 Token。繫結 Token 是唯一識別每筆繫結交易的字元字串。然後再將繫結 Token 傳送給其他工作階段,以便與目前的工作階段繫結。其他工作階段藉由呼叫 sp_bindsession,並使用從第一個工作階段接收到的繫結 Token,來繫結到交易。

[!附註]

工作階段必須有使用中的使用者交易,sp_getbindtokensrv_getbindtoken 才會成功。

繫結 Token 必須從建立第一個工作階段的應用程式程式碼,傳送給其他應用程式程式碼,以供後續的應用程式將其工作階段繫結至第一個工作階段。應用程式無法使用 Transact-SQL 陳述式或 API 函數,來取得另一個處理序所啟動之交易的繫結 Token。可用來傳送繫結 Token 的部分方法如下:

  • 如果工作階段全部都是由相同的應用程式處理序來初始化,則繫結 Token 可以儲存在全域記憶體,或是作為參數傳遞至函數中。

  • 如果工作階段是由個別的應用程式處理序建立,則可使用處理序間通訊 (IPC) 來傳送繫結 Token,例如遠端程序呼叫 (RPC) 或動態資料交換 (DDE)。

  • 繫結 Token 可以儲存在 SQL Server Database Engine 執行個體的資料表中,而這個資料表可由要繫結至第一個工作階段的處理序所讀取。

在一組繫結工作階段中,任何時間只能有一個使用中的工作階段。如果某個工作階段正在執行個體上執行陳述式或等待執行個體的暫止結果,則繫結至此工作階段的其他工作階段都無法存取執行個體,直到目前工作階段完成處理或取消目前陳述式為止。如果執行個體忙著處理來自另一個繫結工作階段的陳述式,則會發生錯誤,指出交易空間正在使用中,工作階段應稍後重試。

當您繫結工作階段時,每個工作階段都會保留其隔離等級設定。使用 SET TRANSACTION ISOLATION LEVEL 來變更一個工作階段的隔離等級設定,並不會影響與它繫結的任何其他工作階段的設定。

繫結工作階段的類型

繫結工作階段有兩種類型:本機與分散式。

  • 本機繫結工作階段

    允許繫結工作階段共用 Database Engine 單一執行個體中單一交易的交易空間。

  • 分散式繫結工作階段

    允許繫結工作階段跨二或多個執行個體共用同一筆交易,直到使用 Microsoft 分散式交易協調器 (MS DTC) 認可或回復整筆交易為止。

分散式繫結工作階段不是由字元字串的繫結 Token 識別,而是由分散式交易識別碼來識別。如果繫結工作階段包含於本機交易中,並使用 SET REMOTE_PROC_TRANSACTIONS ON 在遠端伺服器上執行 RPC,本機繫結交易就可透過 MS DTC 自動升級為分散式繫結交易,並啟動 MS DTC 工作階段。

使用繫結工作階段的時機

在舊版 SQL Server 中,繫結工作階段主要用於開發擴充預存程序,而這些擴充預存程序必須代表呼叫它們的處理序來執行 Transact-SQL 陳述式。讓呼叫處理序傳入繫結 Token 作為擴充預存程序的一個參數,以允許程序加入呼叫處理序的交易空間之中,因此可整合擴充預存程序與呼叫處理序。

在 SQL Server Database Engine 中,使用 CLR 撰寫的預存程序比起擴充預存程序,更安全、更具擴充性也更穩定。CLR 預存程序使用 SqlContext 物件,而不是 sp_bindsession,來聯結呼叫工作階段的內容。

繫結工作階段可以用來開發三層式應用程式,其中商務邏輯可加入個別程式,而這些程式可協同處理單筆商務交易。這些程式必須予以編碼,以便能謹慎協調它們對資料庫的存取。因為兩個工作階段共用相同的鎖定,所以這兩個程式絕不能同時嘗試修改相同的資料。在交易過程的任何時候,只能有一個工作階段執行工作,不允許平行執行。只有在妥善定義的產生點 (例如所有 DML 陳述式都已完成,且也已擷取結果時),才能於工作階段之間切換交易。