不可部分完成的交易
BizTalk 協調流程的設計按照傳統的 'ACID' 交易概念,可執行離散的工作片段。 當執行這些離散或不可部分完成的工作單位時,便會將商務程序從一個一致的狀態移到新的一致、耐用狀態,而且該狀態會是與其他工作單位隔離的。 這通常是使用 Scope 建構來封裝交易式語意的工作單位來完成。 整個協調流程也可以定義為不可部分完成的交易,而不需要使用範圍。 不過,除非協調流程本身被標記為長時間執行或不可部分完成的交易類型,否則不能將範圍標記為交易式的。 不可部分完成的交易可保證任何部分更新在交易更新期間作業失敗時都會自動復原,且會清除交易的結果 (在交易中進行的任何 .NET 呼叫結果除外)。 在 BizTalk 協調流程中的不可部分完成交易與分散式交易協調器 (DTC) 交易的相似處在於,它們通常都是短時間的,而且都具有四個「ACID」屬性 (不可部分完成性、一致性、隔離性與耐用性):
不可部份完成性
交易代表不可部分完成的工作單位。 會執行交易內的所有修改,或是不會執行任何修改。
一致性
在認可時,交易必須保持系統內資料的完整性。 如果交易對資料庫執行資料修改,而在交易開始前該資料庫的內部是一致的,在交易認可後,該資料庫內部必須依然是一致的。 確認這個屬性大部分都是應用程式開發人員的責任。
隔離性
由並行的交易所做的修改,都必須與其他並行交易所做的修改隔離。 並行執行的隔離交易會保留內部資料庫的一致性,使其與依序執行交易的情況完全相同。
耐久性
根據預設,在認可交易後,所有的修改便會永遠留在系統中。 即使發生系統故障,這些修改依然會保存。
在 BizTalk 協調流程中使用的不可部分完成交易支援下列隔離等級:
讀取認可
當正在讀取資料來避免 Dirty 讀取時,會使用共用鎖定,但是在異動結束之前,資料可以變更,這將會產生非重複讀取或虛設資料。
可重複讀取
鎖定是加諸於查詢中使用的所有資料,以防止其他使用者更新資料。 這樣便會防止非重複的讀取,但虛設資料列仍有可能發生。
可序列化
會放置範圍鎖定,以防止其他使用者在交易完成前將資料列更新或插入資料庫。
BizTalk Server 會確認不可部分完成交易內的狀態變更 (例如變數、訊息及物件的修改) 只有在認可交易時,才會在不可部分完成交易的範圍外看到。 中繼狀態變更是與協調流程的其他部分隔離的。
注意
如果不可部分完成的交易包含 接收 圖形、 傳送 圖形或 開始協調流程 圖形,則在交易認可之前,將不會執行對應的動作。
如果您需要資料具有完整的 ACID 屬性 (例如,當資料必須與其他交易隔離時),您必須專門使用不可部分完成的交易。
當不可部分完成的交易失敗時,所有的狀態都會重設,就像是協調流程執行個體從未進入範圍。 BizTalk 對於不可部分完成交易所施加的規則為:所有的變數 (不只是範圍的區域變數) 都會參與交易。 在不可部分完成交易中使用的所有不可序列化變數和訊息,都應該在範圍的區域內宣告。否則,編譯器就會顯示「變數….未標記為可序列化」錯誤。 對於所有不可部分完成的範圍都會假定為「已同步」,如果的確會在不可部分完成的範圍使用 Synchronized 關鍵字,協調流程編譯器便會提供多餘使用的警告。 共用資料的同步處理會從範圍的開頭延伸,直到範圍的成功完成 (包括在範圍結尾的狀態持續性),或是直到例外狀況處理常式的完成部分 (如果發生錯誤)。 同步處理的網域不會延伸到補償處理常式。
不可部分完成的交易可以與逾時值關聯,協調流程會在該點停止交易,並且會擱置執行個體。 如果不可部分完成交易包含「接收」 圖形、「傳送」圖形或「啟動協調流程」圖形,在已經認可交易之前,不會發生對應的動作。
當使用者刻意擲回 RetryTransactionException 時,或當不可部分完成的交易嘗試認可時引發 PersistenceException 時,就會重試不可部分完成的交易。 例如,如果不可部分完成的交易是分散式 DTC 交易的一部分,而且該交易的其他一些參與者已經停止交易時,後者便有可能發生。 同樣地,如果在交易嘗試認可時發生資料庫連線問題,也會引發 PersistenceException 。 如果這是針對 具有 Retry=True的不可部分完成範圍發生,則最多會重試 21 次。 根據預設,每次重試之間的延遲為兩秒鐘 (不過該值是可修改的)。 在耗盡 21 次重試之後,如果依然無法認可交易,便會擱置整個協調流程執行個體。 使用手動方式即可繼續協調流程,而且協調流程會用全新的計數器,在產生問題的不可部分完成範圍從頭開始。
注意
只有 RetryTransactionException 和 PersistenceException 可能會導致不可部分完成的範圍重試。 不可部分完成範圍中引發的任何其他例外狀況都會導致重試,即使 Retry 屬性設定為 True也一樣。 如果這是用來造成重試) 的例外狀況,則可以在 RetryTransactionException 上使用 public 屬性覆寫每兩個連續重試之間的兩秒預設延遲 (。
不可部分完成的範圍會限制巢狀其他無法巢狀其他交易或包含 Catch - 例外狀況 區塊。
儘管不可部分完成交易的行為與 DTC 交易相像,根據預設,這類交易卻不是明確的 DTC 交易。 您可以使這類交易明確成為 DTC 交易,其條件為交易中使用的任何物件都是衍生自 System.EnterpriseServices.ServicedComponents 的 COM+ 物件,而且在交易元件之間的隔離層級也都相符。
注意
不可部分完成的交易無法在內部包含其他任何交易,也無法包含例外狀況處理常式。
注意
如果不可部分完成的交易包含相符的傳送與接收動作,也就是「要求-回應」組,或是使用相同相互關聯集合的傳送與接收。
如果您要在協調流程內使用不可序列化物件,就必須只在不可部分完成的交易內使用該物件。 每當協調流程由引擎所保存時,在不可部分完成交易外使用任何這類物件都必須承擔資料損失的風險。
警告
每個「不可部分完成」的範圍都代表一個持續點,而且這表示在每個持續點都會將協調流程的狀態儲存到資料庫中。 「不可部分完成」範圍的大量使用,將會增加協調流程中的延遲情況。 與其使用「不可部分完成」範圍以建立不可序列化物件,您可以使用不需要「不可部分完成」範圍的「靜態」方法呼叫,進而排除持續點的需要。