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