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