Menangani Operasi Pemulihan

Dalam operasi pemulihan , sistem pemrosesan transaksi (TPS) mencoba memulihkan statusnya dari informasi yang ada di aliran log. Setelah operasi pemulihan selesai, semua transaksi harus dalam keadaan berkomitmen atau digulung balik, dan semua data sumber daya harus dalam keadaan baik yang diketahui.

Terkadang TPS berhenti sebelum semua transaksinya selesai. Misalnya, sistem operasi mungkin mengalami crash. Oleh karena itu, manajer sumber daya harus memulai operasi pemulihan setiap kali mereka mulai berjalan. Operasi pemulihan mencoba menentukan apakah ada transaksi yang tidak lengkap. Jika transaksi yang tidak lengkap ditemukan di log, operasi pemulihan mencoba melakukan atau mengembalikan transaksi tersebut.

Untuk TPS berbasis KTM, setiap operasi pemulihan terdiri dari dua langkah. Langkah pertama melibatkan pemulihan informasi dari aliran log objek manajer transaksi. Langkah kedua melibatkan pemulihan informasi dari aliran log resource manager.

TPS dapat pulih ke akhir semua aliran log atau, jika manajer sumber dayanya mempertahankan nilai jam virtual, TPS dapat memulihkan hingga nilai jam tertentu.

Memulihkan Informasi dari Aliran Log Objek Manajer Transaksi

Segera setelah manajer sumber daya memanggil ZwCreateTransactionManager atau ZwOpenTransactionManager, ia harus memanggil ZwRecoverTransactionManager. Rutinitas ZwRecoverTransactionManager membaca aliran log milik objek manajer transaksi. Rutinitas ini merekonstruksi status objek manajer transaksi (termasuk semua transaksi, pendaftaran, dan manajer sumber daya) dari informasi pemulihan yang ada di aliran log, dimulai pada area hidupkan ulang terakhir yang dibuat dan berakhir oleh KTM di akhir aliran.

Untuk memulihkan dari area hidupkan ulang terakhir hingga nilai jam virtual tertentu, manajer sumber daya dapat memanggil ZwRollforwardTransactionManager alih-alih ZwRecoverTransactionManager.

Memulihkan Informasi dari Aliran Log Resource Manager

Segera setelah manajer sumber daya memanggil ZwCreateResourceManager atau ZwOpenResourceManager, ia harus memanggil ZwRecoverResourceManager. Rutinitas ZwRecoverResourceManager mencoba memulihkan transaksi yang terkait dengan setiap pendaftaran manajer sumber daya.

Saat manajer sumber daya memanggil ZwRecoverResourceManager, KTM mengirim pemberitahuan TRANSACTION_NOTIFY_RECOVER untuk setiap pendaftaran manajer sumber daya. Manajer sumber daya harus memanggil ZwRecoverEnlistment setiap kali menerima salah satu pemberitahuan TRANSACTION_NOTIFY_RECOVER.

Saat manajer sumber daya memanggil ZwRecoverEnlistment, KTM mengirimkan salah satu pemberitahuan berikut:

  • TRANSACTION_NOTIFY_COMMIT

    Manajer sumber daya harus menggunakan informasi dalam aliran lognya untuk melakukan transaksi dan kemudian harus memanggil ZwCommitComplete.

  • TRANSACTION_NOTIFY_ROLLBACK

    Manajer sumber daya harus menggunakan informasi dalam aliran lognya untuk mengembalikan transaksi dan kemudian harus memanggil ZwRollbackComplete.

  • TRANSACTION_NOTIFY_INDOUBT

    KTM belum menentukan status transaksi dan akan mengirim pemberitahuan penerapan atau pembatalan nanti.

Biasanya, KTM mengirimkan pemberitahuan TRANSACTION_NOTIFY_COMMIT jika menentukan bahwa semua manajer sumber daya yang disebut ZwPrepareComplete sebelum TPS berhenti dan dimulai ulang. KTM mengirimkan pemberitahuan TRANSACTION_NOTIFY_ROLLBACK jika menentukan bahwa satu atau beberapa manajer sumber daya tidak memanggil ZwPrepareComplete.

Setelah KTM mengirim pemberitahuan TRANSACTION_NOTIFY_RECOVER untuk setiap pendaftaran, KTM mengirimkan pemberitahuan TRANSACTION_NOTIFY_LAST_RECOVER.

Jika manajer sumber daya Anda bernama ZwRollforwardTransactionManager alih-alih ZwRecoverTransactionManager, manajer sumber daya hanya harus memulihkan hingga nilai jam virtual yang ditentukan ke ZwRollforwardTransactionManager.

Resource manager dapat memanggil ZwSetInformationEnlistment untuk mengatur informasi pemulihan yang disesuaikan. KTM menyimpan informasi ini dan menulisnya ke aliran log, tetapi KTM tidak mencoba menginterpretasikan informasi. Manajer sumber daya dapat mengambil informasi pemulihan kapan saja dengan memanggil ZwQueryInformationEnlistment.

Manajer transaksi yang unggul terkadang menerima pemberitahuan TRANSACTION_NOTIFY_RECOVER_QUERY selama operasi pemulihan.