Kötelezési műveletek kezelése

Kétféle véglegesítési művelet létezik: egyfázisú véglegesítés és többfázisú véglegesítés. Az egyfázisú véglegesítési művelet egyetlen értesítésből áll, amelyekre az erőforrás-kezelőknek válaszolniuk kell, míg a többfázisú véglegesítési művelet további értesítéseket tartalmaz az előkészítési lépésekhez.

Az egyfázisú véglegesítési művelet implementálása egyszerűbb. Olyan tranzakciófeldolgozó rendszerek (TPS-k) esetében célszerű, amelyek az alábbi jellemzők egyikével rendelkeznek:

  • Egyetlen erőforrás-kezelő.

  • Több erőforrás-kezelő van, amelyek közül csak egy nem írásvédett, és nem vesznek részt a véglegesítési műveletben.

Többfázisú véglegesítési műveletre van szükség, ha több erőforrás-kezelő is részt vesz a véglegesítési műveletben.

Single-Phase véglegesítési műveletek

Ha azt szeretné, hogy a TPS támogassa az egyfázisú véglegesítési műveleteket, egy (és csak egy) erőforrás-kezelőnek regisztrálnia kell, hogy TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT értesítéseket kapjon a regisztrációiról. Minden más erőforrás-kezelő csak olvasható lehet.

A felsőbb szintű tranzakciókezelőt tartalmazó TPS nem használhat egyfázisú véglegesítést.

Ha egy erőforrás-kezelő regisztrált TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT értesítések fogadására, a KTM ekkora értesítést küld, amikor egy tranzakciós ügyfél meghívja a ZwCommitTransactiont.

Amikor az erőforrás-kezelő TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT értesítést kap egy tranzakcióról, véglegesítheti a tranzakciót, vagy elutasíthatja az egyfázisú véglegesítést.

A tranzakció véglegesítéséhez az erőforrás-kezelőnek a következőket kell tennie:

  1. Ürítse ki a nem állandó gyorsítótárban (memóriában) tárolt adatokat, például a CLFS-naplóstream CLFS-rendezési területét.

    Az erőforrás-kezelőnek át kell helyeznie az adatokat a gyorsítótárból egy tartós tárolóeszközre. Egy CLFS-t használó erőforrás-kezelő például meghívhatja a ClfsFlushBufferst.

  2. Az összes adatmódosítás véglegessé és nyilvánossá tétele (azaz az erőforrás-kezelő hatókörén kívül).

  3. Hívja fel a ZwCommitComplete parancsot.

A ZwCommitComplete meghívása után az erőforrás-kezelőnek fel kell hívnia a ZwClose-t a beléptetési leíró bezárásához.

A tranzakció egyfázisú véglegesítési műveletének elutasításához az erőforrás-kezelő meghívhatja a ZwSinglePhaseReject parancsot. Ha az erőforrás-kezelő meghívja a ZwSinglePhaseRejectet, a KTM azonnal egyfázisosról többfázisúra módosítja a véglegesítési műveletet.

Ha más erőforrás-kezelők vesznek részt ugyanabban a tranzakcióban, azoknak csak olvashatónak kell lenniük. Regisztrálniuk kell azonban, hogy megkapják a TRANSACTION_NOTIFY_RM_DISCONNECTED értesítést, amelyet akkor kapnak, ha az egyfázisú véglegesítési műveletet kezelő erőforrás-kezelő bezárja a regisztrációs leírót anélkül, hogy azt jelezték volna, hogy véglegesített vagy visszaállította a tranzakciót.

Többfázisú véglegesítési műveletek

A többfázisú véglegesítési művelet akkor kezdődik, amikor az alábbi események egyike történik:

A többfázisú véglegesítési műveletek három egymást követő fázisból állnak: előkészület, előkészítés és véglegesítés.

Előkészítési fázis

A véglegesítési művelet előkészületi fázisa (más néven nulla fázis) akkor kezdődik, amikor a KTM TRANSACTION_NOTIFY_PREPREPARE értesítést küld az összes erőforrás-kezelőnek. A KTM akkor küldi el ezt az értesítést, ha egyetlen erőforrás-kezelő sem támogat egy egyfázisú véglegesítési műveletet a tranzakcióhoz, vagy ha egy kiváló tranzakciókezelő meghívja a ZwPrePrepareEnlistmentet.

Amikor minden erőforrás-kezelő megkapja a TRANSACTION_NOTIFY_PREPREPARE értesítést, a következőket kell tennie:

  1. Ürítse ki a nem állandó gyorsítótárban (memóriában) tárolt adatokat, például a CLFS log streamhez tartozó CLFS rendezési terület adatait.

    Az erőforrás-kezelőnek át kell helyeznie az adatokat a gyorsítótárból egy tartós tárolóeszközre. Egy CLFS-t használó erőforrás-kezelő például meghívhatja a ClfsFlushBufferst.

  2. Hívja meg a ZwPrePrepareComplete parancsot.

Miután egy erőforrás-kezelő meghívta a ZwPreprepareComplete függvényt, továbbra is fogadhat és kiszolgálhat ügyfélkéréseket. Az erőforrás-kezelőnek azonban az összes adatmódosítást gyorsítótárazási műveletekként kell kezelnie, amelyeket a rendszer azonnal tartós tárolóeszközre ír.

Ha egy erőforrás-kezelő hibát tapasztal egy TRANSACTION_NOTIFY_PREPREPARE-értesítés feldolgozása közben, a ZwRollbackEnlistment meghívásával visszaállíthatja a tranzakciót.

Előkészítési fázis

A véglegesítési művelet előkészítési fázisa (más néven első fázis) akkor kezdődik, amikor a KTM TRANSACTION_NOTIFY_PREPARE értesítést küld az összes erőforrás-kezelőnek. A KTM TRANSACTION_NOTIFY_PREPREPARE után küldi el ezt az értesítést, ha egyetlen erőforrás-kezelő sem támogatja az egyfázisú véglegesítést, vagy ha egy kiváló tranzakciókezelő meghívja a ZwPrepareEnlistmentet.

Amikor minden erőforrás-kezelő megkapja a TRANSACTION_NOTIFY_PREPARE értesítést, a következőket kell tennie:

  1. Állítsa le az ügyfélkérések karbantartását, és jelentse az ügyfél későbbi kéréseit ügyfélhibákként.

  2. Győződjön meg arról, hogy az összes adat át lett helyezve a tartós tárolóba.

  3. A ZwPrepareComplete meghívása.

Ha egy erőforrás-kezelő hibát tapasztal egy TRANSACTION_NOTIFY_PREPARE-értesítés feldolgozása során, a ZwRollbackEnlistment meghívásával visszaállíthatja a tranzakciót. Az erőforrás-kezelő azonban nem tudja visszagörgetni a tranzakciót, miután meghívta a ZwPrepareComplete függvényt.

Véglegesítési fázis

A véglegesítési művelet véglegesítési fázisa (más néven második fázis) akkor kezdődik, amikor a KTM TRANSACTION_NOTIFY_COMMIT értesítést küld az összes erőforrás-kezelőnek. A KTM TRANSACTION_NOTIFY_PREPARE után küldi el ezt az értesítést, ha egyetlen erőforrás-kezelő sem támogatja az egyfázisú véglegesítést, vagy ha egy felsőbb szintű tranzakciókezelő meghívja a ZwCommitEnlistmentet.

Amikor minden erőforrás-kezelő megkapja a TRANSACTION_NOTIFY_COMMIT értesítést, a következőket kell tennie:

  1. Az összes adatmódosítás véglegessé és nyilvánossá tétele (azaz más tranzakciók számára is láthatóvá tétele).

    Az erőforrás-kezelők általában állandó és nyilvános módosításokat hajtanak végre a tranzakció mentett adatainak a naplóstreamből az adatbázis nyilvános, állandó tárolójába való másolásával. A naplóstreamek használatáról további információt a Naplóstreamek használata A KTM használatával című témakörben talál.

  2. Hívja fel a ZwCommitComplete parancsot.

Miután az erőforrás-kezelő meghívja a ZwCommitComplete-t, a ZwClose-t kell meghívnia a beléptetési leíró bezárásához.

Ha egy erőforrás-kezelő hibát tapasztal egy TRANSACTION_NOTIFY_COMMIT-értesítés feldolgozása közben, akkor le kell állítania magát. Amikor az operációs rendszer legközelebb újra betölti az erőforrás-kezelőt, az erőforrás-kezelő helyreállítási folyamatának vissza kell állítania a tranzakciót egy olyan állapotba, amely a hiba bekövetkezése előtt jól ismert volt.