Однофазна та багатофазна фіксація транзакції ws_fxtransactions, Microsoft Docs
Кожним ресурсом, що використовується в транзакції, керує диспетчер ресурсів, дії якого координуються диспетчером транзакцій. У розділі Прикріплення ресурсів як учасників транзакції [ws_fxtransactions_4] описується порядок зарахування одного або кількох ресурсів до транзакції. У цьому розділі також описано порядок координації процесу фіксації транзакції між зарахованими ресурсами.
Після завершення транзакції програма формує запит на фіксацію або відкат транзакції. Диспетчер транзакцій має виключити ситуації, у яких один із диспетчерів ресурсів голосує за фіксацію, а інші – за відкат транзакції.
Якщо транзакція включає кілька ресурсів, потрібно виконати двофазну фіксацію (2PC). Протокол двофазної фіксації (фаза підготовки та фаза фіксації) гарантує, що при завершенні транзакції всі зміни, зроблені над усіма ресурсами, або повністю фіксуються або повністю відкочуються. Після завершення транзакції, результат повідомляється всім учасникам. Докладніші відомості про протокол двофазної фіксації див. у книзі Джима Грея (Jim Gray) "Transaction Processing: Concepts and Techniques (Morgan Kaufmann Series in Data Management Systems) ISBN: 1558601902".
Крім того, оптимізувати продуктивність транзакції можна шляхом участі у протоколі однофазної фіксації. Для отримання додаткової інформації див. Оптимізація продуктивності за допомогою механізмів сповіщення про однофазну фіксацію та підвищуваного однофазного повідомлення [ws_fxtransactions_4].
Двофазна фіксація (2PC)
У першій фазі транзакції диспетчер транзакцій опитує кожен ресурс, щоб визначити, чи слід виконати фіксацію чи відкат.транзакції. У другій фазі транзакції диспетчер транзакцій повідомляє кожен ресурс результату опитування, дозволяючи ресурсам виконати необхідні операції очищення.
Для участі в такій транзакції диспетчеру ресурсів необхідно реалізувати інтерфейс IEnlistmentNotification, який надає методи, що викликаються диспетчером транзакцій як повідомлення двофазної фіксації. Нижче наведено приклад такої реалізації.
Фаза підготовки (фаза 1)
При отриманні запиту Commit від програми диспетчер транзакцій починає фазу підготовки всіх зарахованих учасників шляхом виклику методу Prepare для кожного зарахованого ресурсу з метою отримання голосів за результат транзакції.
Диспетчер ресурсів, що реалізує інтерфейс IEnlistmentNotification, спочатку необхідно реалізувати метод Prepare(PreparingEnlistment), як показано в наступному простому прикладі.
Після отримання цього виклику диспетчеру стійких ресурсів необхідно записати в журнал дані для відновлення транзакції (доступ до яких здійснюється шляхом отримання властивості RecoveryInformation) і всю необхідну інформацію для завершення транзакції фіксацією. Запис цієї інформації в рамках методу Prepare не потрібний, оскільки диспетчер ресурсів може зробити це в робочому потоці.
Програма отримує відомості про успішну підготовку до фіксації транзакції після того, як усі диспетчери ресурсів проголосують за допомогою методу Prepared.
Фаза фіксації (фаза 2)
Якщо у другій фазі транзакції диспетчер транзакцій отримує відомості про успішну підготовку від усіх диспетчерів ресурсів (усі диспетчери ресурсів викликали метод Prepared наприкінці фази 1), він викликає метод Commit кожного диспетчера ресурсів. Після цього диспетчери ресурсів можуть зафіксувати зміни.
Якщо у фазі 1 хоча б від одного диспетчера ресурсів отримано повідомлення про те, що підготовку виконати не вдалося, диспетчер транзакцій викликає метод Rollback кожного диспетчера ресурсів і повідомляє додатку про збій фіксації.
Таким чином, диспетчер ресурсів, що використовується, необхідно реалізувати наступні методи.
Диспетчер ресурсів повинен виконати будь-які дії, необхідні для завершення транзакції відповідно до типу повідомлення, а потім інформувати диспетчер транзакцій про завершення транзакції, викликавши метод Done для параметра Enlistment. Це може бути виконано у робочому потоці. Зауважте, що сповіщення другого етапу можуть бути вбудовані в той же потік, який викликав метод Prepared на першій фазі. Таким чином, після виклику методу Prepared не потрібно виконувати жодних дій (наприклад, знімати блокування), які мали бути виконані перед отриманням повідомлень другого етапу.
Реалізація методу InDoubt
Зрештою, необхідно реалізувати метод InDoubt для диспетчера нестійких ресурсів. Цей метод викликається при втраті контакту диспетчера транзакцій з одним або декількома учасниками, внаслідок чого їхній стан стає невідомим. У цьому випадку необхідно зробити відповідний запис у журналі, щоб можна було пізніше з'ясувати, чи хтось із учасників транзакції залишився в неузгодженому стані.
Оптимізація однофазної фіксації
Протокол однофазної фіксації найбільш ефективний при використанні під час виконання, оскільки всі зміни здійснюються без будь-якої координації. Додаткові відомості про цей протокол див. у розділі Оптимізація продуктивності за допомогою механізмів сповіщення про однофазну фіксацію та однофазне сповіщення, що підвищується.[ws_fxtransactions_4].