Еднофазов срещу многофазен ангажимент ws_fxtransactions, Microsoft Docs
Всеки ресурс, използван в транзакция, се управлява от мениджър на ресурси, чиито действия се координират от мениджъра на транзакциите. Разделът Привличане на ресурси като участници в транзакция [ws_fxtransactions_4] описва как един или повече ресурси могат да бъдат включени в транзакция. Този раздел също така описва как да координирате процеса на ангажиране на транзакция между включени ресурси.
Когато транзакцията е завършена, приложението генерира заявка за извършване или отмяна на транзакцията. Мениджърът на транзакциите трябва да избягва ситуации, в които един от мениджърите на ресурси гласува за ангажиране, а останалите гласуват за отмяна на транзакцията.
Ако една транзакция включва множество ресурси, трябва да се извърши двуфазов ангажимент (2PC). Двуфазовият протокол за ангажиране (фаза на подготовка и фаза на ангажиране) гарантира, че когато транзакцията приключи, всички промени, направени на всички ресурси, са или напълно ангажирани, или напълно отменени. След приключване на транзакцията резултатът се съобщава на всички участници. За повече информация относно протокола за двуфазов комит, вижте книгата на Джим Грей „Обработка на транзакции: Концепции и техники (серия Morgan Kaufmann в Системи за управление на данни) ISBN:1558601902“.
Можете също така да оптимизирате ефективността на транзакциите, като участвате в еднофазен протокол за ангажиране. За повече информация вижте Оптимизиране на производителността с еднофазно известие за ангажиране и повишаване на механизмите за еднофазно известяване [ws_fxtransactions_4].
Двуфазна фиксация (2PC)
В първата фаза на транзакция мениджърът на транзакции анкетира всеки ресурс, за да определи дали да се ангажира или да върне обратно.сделки. Във втората фаза на транзакцията мениджърът на транзакции уведомява всеки ресурс за резултата от анкетата, позволявайки на ресурсите да извършат необходимите операции за почистване.
За да участва в такава транзакция, мениджърът на ресурси трябва да имплементира интерфейса IEnlistmentNotification, който излага методите, които мениджърът на транзакциите извиква като известия при двуфазов комит. По-долу е даден пример за такова изпълнение.
Подготвителна фаза (Фаза 1)
Когато дадено приложение получи заявка за ангажиране, мениджърът на транзакции влиза във фазата на подготовка на всички включени участници, като извиква метода Prepare на всеки включен ресурс, за да получи гласове за резултата от транзакцията.
Мениджър на ресурси, който имплементира интерфейса IEnlistmentNotification, трябва първо да имплементира метода Prepare(PreparingEnlistment), както е показано в следващия прост пример.
При получаване на това обаждане мениджърът на трайни ресурси трябва да регистрира данните за възстановяване на транзакцията (достъпни чрез извличане на свойството RecoveryInformation) и всяка необходима информация за извършване на транзакцията. Няма нужда да записвате тази информация в метода Prepare, защото мениджърът на ресурси може да го направи в нишката на работника.
Приложението получава информация за успешната подготовка за извършване на транзакцията, след като всички мениджъри на ресурси са гласували по метода Prepared.
Фаза на фиксиране (фаза 2)
Във втората фаза на транзакцията, ако мениджърът на транзакции получи информация за успешна подготовка от всички мениджъри на ресурси (всички мениджъри на ресурси, наречени Prepared метод в края на фаза 1), той извиква метода Commit за всеки мениджър на ресурси. Мениджърите на ресурси могат след това да ангажират промените.
Ако се получи съобщение от поне един мениджър на ресурси във фаза 1, че подготовката е неуспешна, мениджърът на транзакции извиква метода Rollback на всеки мениджър на ресурси и уведомява приложението, че ангажиментът е неуспешен.
Следователно мениджърът на ресурси, който използвате, трябва да приложи следните методи.
Мениджърът на ресурсите трябва да предприеме всички необходими действия за завършване на транзакцията според типа на известието и след това да информира мениджъра на транзакциите, че транзакцията е приключила чрез извикване на метода Done на параметъра Enlistment. Това може да се направи в работна нишка. Обърнете внимание, че известията от втория етап могат да бъдат вградени в същата нишка, която извика метода Prepared в първия етап. По този начин, след като извикате метода Prepared, не е необходимо да извършвате никакви действия (например освобождаване на ключалки), които трябва да бъдат извършени преди получаване на известия за втория етап.
Внедряване на метода InDoubt
И накрая, трябва да внедрите метода InDoubt за диспечера на летливи ресурси. Този метод се извиква, когато мениджърът на транзакциите загуби контакт с един или повече участници, оставяйки състоянието им неизвестно. В този случай трябва да направите подходящ запис в журнала, за да можете по-късно да разберете дали някой от участниците в транзакцията е оставен в непоследователно състояние.
Оптимизираща монофазна фиксация
Протоколът за еднофазов комит е най-ефективен, когато се използва по време на изпълнение, тъй като всички промени се правят без изрична координация. За повече информация относно този протокол вижте Оптимизиране на производителността с еднофазно известяване за ангажиране и усилени механизми за еднофазно известяване[ws_fxtransactions_4].