告訴教你如何在ADO.NET事務中登記資源
ADO.NET事務有很多值得學習的地方,這里我們主要介紹在事務中將資源登記為參與者,包括介紹持久登記等方面。參與事務的每個資源都由資源管理器進行管理,而后者的操作則由事務管理器進行協調。這一協調通過通知來執行,這些通知會提供給已通過事務管理器在事務中登記的訂戶。本主題介紹如何在事務中登記一個資源(或多個資源)以及不同的登記類型。在單階段和多階段中提交事務主題介紹如何在已登記的資源之間協調事務提交。
在ADO.NET事務中登記資源
資源若要參與事務,它必須在事務中進行登記。Transaction類定義了一組提供此功能的方法,這些方法的名稱以Enlist開頭。不同的Enlist方法對應于資源管理器可能具有的不同登記類型。具體來說,EnlistVolatile方法用于登記可變資源,而EnlistDurable方法則用于登記持久資源。
#T#資源管理器的持久性(反之為可變性)是指資源管理器是否支持故障恢復。如果資源管理器支持故障恢復,則它會在第1階段(準備階段)將數據保存到持久存儲區中;這樣,一旦資源管理器出現故障,它就可在恢復時在事務中重新登記,并根據從TM接收到的通知執行適當的操作。通常,可變資源管理器管理如內存中的數據結構之類的可變資源(如內存中的事務處理哈希表),而持久資源管理器則管理具有更持久的后備存儲區的資源(例如,其后備存儲區為磁盤的數據庫)。
為了簡單起見,在根據資源的持久性支持決定是使用EnlistDurable還是EnlistVolatile方法后,應為資源管理器實現IEnlistmentNotification接口,從而將資源登記為參與兩階段提交(2PC)。有關2PC的更多信息,請參見在單階段和多階段中提交事務。單個參與者可以多次調用EnlistDurable和EnlistVolatile來登記到其中的某一協議。
持久登記
EnlistDurable方法用于登記要作為持久資源參與事務的資源管理器。如果持久資源管理器在ADO.NET事務執行期間關閉,則它在重新聯機后,應在它作為參與者且未完成第2階段的所有事務中重新登記(使用Reenlist方法)來執行恢復,并在完成恢復處理后調用RecoveryComplete。有關恢復的更多信息,請參見執行恢復。
EnlistDurable方法都采用Guid對象作為其第一個參數。事務管理器使用Guid將持久登記與特定的資源管理器關聯。因此,資源管理器在重新啟動后必須統一使用同一Guid來標識自身,即使跨不同的資源管理器時也是如此;否則恢復操作就可能失敗。
EnlistDurable方法的第二個參數是對資源管理器所實現的用于接收事務通知的對象的引用。您所使用的重載會向事務管理器通知資源管理器是否支持單階段提交(SPC)優化。大多數情況下,應實現IEnlistmentNotification接口來參與兩階段提交(2PC)。但如果要優化提交過程,可考慮實現ISinglePhaseNotification接口來參與SPC。有關SPC的更多信息,請參見在單階段和多階段中提交事務和使用單階段提交和可提升的單階段通知進行優化。
第三個參數是EnlistmentOptions枚舉,該枚舉的值可以為None或EnlistDuringPrepareRequired。如果將該值設置為EnlistDuringPrepareRequired,則這種登記類型可在從事務管理器接收到準備通知時登記附加資源管理器。但是,您應清楚這種登記類型不適合執行單階段提交優化。
可變登記
管理可變資源(如緩存)的參與者應使用EnlistVolatile方法進行登記。此類對象可能無法獲取事務的結果,或者在系統出現故障后可能無法恢復它們所參與的任何事務的狀態。
如前面所述,資源管理器在管理內存中的可變資源時應進行可變登記。使用EnlistVolatile的優點之一就是不會強制執行不必要的事務升級。有關事務升級的更多信息,請參見事務管理升級主題。登記可變性意味著事務管理器處理登記的方式與事務管理器對資源管理器的預期行為之間存在差異。這是因為可變資源管理器不執行恢復。EnlistVolatile方法不采用Guid參數,因為可變資源管理器不執行恢復,并且不會調用需要Guid的Reenlist方法。
與持久登記一樣,無論使用哪種重載方法進行登記,都會向事務管理器指示資源管理器是否支持單階段提交優化。由于可變資源管理器不能執行恢復,因此在準備階段不會為可變登記寫入任何恢復信息。因此,調用RecoveryInformation方法會導致InvalidOperationException。