Membuat Resource Manager
Manajer sumber daya mempertahankan data setiap transaksi dan mencatat operasi transaksi. Jika sistem pemrosesan transaksi (TPS) memiliki beberapa manajer sumber daya, setiap manajer sumber daya dapat berpartisipasi dalam operasi penerapan, pembatalan, dan pemulihan setiap transaksi.
Setiap manajer sumber daya harus mengekspor antarmuka yang dapat digunakan klien transaksi untuk mengakses database atau sumber daya lain yang dikelola manajer sumber daya.
Biasanya, resource manager mode kernel harus melakukan tugas berikut dalam urutan yang tercantum:
Membuat aliran log.
Manajer sumber daya dapat menggunakan Common Log File System (CLFS), atau beberapa kemampuan pengelogan lainnya, untuk mempertahankan aliran log mereka. Panggilan ke ClfsCreateLogFile membuat aliran log CLFS. Manajer sumber daya harus menggunakan aliran log untuk merekam informasi apa pun yang diperlukan untuk melakukan, menggulung balik, atau memulihkan transaksi. Selain itu, KTM menggunakan aliran log untuk merekam setiap perubahan status internal yang mungkin diperlukan untuk memulihkan transaksi.
Buat objek manajer transaksi.
Panggilan ke ZwCreateTransactionManager membuat objek manajer transaksi dan menghubungkan manajer sumber daya ke aliran log CLFS tambahan yang ditentukan manajer sumber daya.
Pulihkan status manajer transaksi.
Panggilan ke ZwRecoverTransactionManager membaca aliran log objek manajer transaksi (yang dikelola KTM) dan menentukan apakah TPS dimatikan sebelum semua transaksi selesai (misalnya, karena sistem mengalami crash). KTM memulihkan status internalnya berdasarkan informasi dalam aliran log.
Buat objek resource manager.
Panggilan ke ZwCreateResourceManager membuat objek manajer sumber daya dan mengaitkannya dengan objek manajer transaksi yang dibuat sebelumnya.
Pulihkan status resource manager.
Panggilan ke ZwRecoverResourceManager menyebabkan KTM mengirim manajer sumber daya TRANSACTION_NOTIFY_RECOVER pemberitahuan untuk setiap transaksi yang sedang berlangsung terakhir kali manajer sumber daya dimatikan. Untuk informasi tentang bagaimana manajer sumber daya harus merespons pemberitahuan ini, lihat Menangani Operasi Pemulihan.
Menerima transaksi dari klien.
Biasanya, klien membuat objek transaksi dan menggunakan antarmuka klien manajer sumber daya untuk meneruskan GUID objek transaksi ke manajer sumber daya. Misalnya, manajer sumber daya mungkin menyediakan rutinitas CreateDataObject yang mirip dengan topik Memahami Komponen TPS .
Daftarkan dalam setiap transaksi.
Panggilan ke ZwOpenTransaction membuka handel ke objek transaksi, lalu panggilan ke ZwCreateEnlistment membuat pendaftaran untuk transaksi. Pendaftaran memungkinkan manajer sumber daya untuk menerima serangkaian pemberitahuan transaksi tertentu.
Aktifkan penerimaan pemberitahuan transaksi.
Manajer sumber daya dapat memanggil ZwGetNotificationResourceManager untuk mendapatkan pemberitahuan secara sinkron, atau dapat memanggil TmEnableCallbacks untuk mendaftarkan rutinitas panggilan balik ResourceManagerNotification yang dipanggil KTM setiap kali pemberitahuan tersedia.
Permintaan akses sumber daya layanan dari klien, tetapi tidak membuat perubahan permanen.
Setelah klien membuat objek transaksi, biasanya memanggil antarmuka manajer sumber daya untuk mengakses sumber daya manajer sumber daya. Misalnya, manajer sumber daya untuk database mungkin menerima permintaan untuk membaca dari dan menulis ke database.
Manajer sumber daya harus merekam hasil operasi baca dan tulis dalam aliran log CLFS atau kemampuan pengelogan lainnya sampai menerima pemberitahuan bahwa operasi transaksi akan dilakukan, digulung balik, atau dipulihkan.
Menerapkan atau mengembalikan operasi klien.
Akhirnya, manajer sumber daya menerima pemberitahuan untuk mulai menerapkan atau mengembalikan operasi yang telah dilakukan klien. Sebagai tanggapan, manajer sumber daya harus membuat operasi klien permanen atau membuangnya. Untuk informasi selengkapnya tentang cara menangani pemberitahuan penerapan dan pembatalan, lihat Menangani Operasi Transaksi.
Terkadang, manajer sumber daya mungkin harus mencoba memaksa KTM untuk dengan cepat memberikan pemberitahuan penerapan atau pembatalan, mungkin karena manajer sumber daya telah menentukan bahwa perangkat dihapus dari kejutan. Dalam kasus seperti itu, manajer sumber daya dapat memanggil TmRequestOutcomeEnlistment.
Tutup handel objek pendaftaran.
Setelah manajer sumber daya selesai memproses transaksi, manajer sumber daya harus memanggil ZwClose untuk menutup handel objek pendaftaran
Tutup handel objek resource manager dan handel objek manajer transaksi.
Sebelum manajer sumber daya dibongkar, manajer sumber daya harus memanggil ZwClose untuk menutup handel objek manajer sumber daya dan handel objek manajer transaksi.
Langkah 1 hingga 5 harus dilakukan dalam kode inisialisasi manajer sumber daya Anda. Misalnya, jika manajer sumber daya Anda adalah driver mode kernel, kode inisialisasi adalah rutinitas DriverEntry driver.
Langkah 6 hingga 11 biasanya dilakukan dalam kode yang merespons permintaan dari klien transaksional.
Langkah 12 harus dilakukan dalam kode pembersihan akhir resource manager Anda, seperti rutinitas Bongkar Muat driver mode kernel.
Membuat Pendaftaran Read-Only
Pendaftaran baca-saja adalah pendaftaran yang tidak menerima pemberitahuan apa pun dari KTM. Manajer sumber daya dapat membuat pendaftaran baca-saja dengan memanggil ZwReadOnlyEnlistment. Panggilan ini menyebabkan KTM berhenti mengirimkan pemberitahuan ke manajer sumber daya.
Setelah manajer sumber daya Anda memanggil ZwCreateEnlistment, manajer sumber daya dapat memanggil ZwReadOnlyEnlistment kapan saja hingga titik di mana ia biasanya akan memanggil ZwPrepareComplete.
Ada dua alasan mengapa Anda mungkin ingin manajer sumber daya Anda memanggil ZwReadOnlyEnlistment.
Manajer sumber daya Anda telah berpartisipasi dalam transaksi dan, pada titik tertentu sebelum menerima pemberitahuan TRANSACTION_NOTIFY_COMMIT, manajer sumber daya menentukan bahwa manajer sumber daya tidak lagi harus berpartisipasi dalam operasi penerapan transaksi.
Misalnya, ketika manajer sumber daya menerima pemberitahuan TRANSACTION_NOTIFY_PREPARE, mungkin menentukan bahwa tidak ada operasi transaksi yang mengubah database manajer sumber daya. Manajer sumber daya dapat memanggil ZwReadOnlyEnlistment alih-alih ZwPrepareComplete untuk menghapus dirinya dari transaksi.
Manajer sumber daya Anda tidak pernah berpartisipasi dalam operasi penerapan transaksi apa pun.
Misalnya, manajer sumber daya Anda mungkin memantau data yang dikirim klien, tanpa memodifikasi database yang disimpan. Dalam hal ini, manajer sumber daya Anda mungkin memanggil ZwReadOnlyEnlistment segera setelah disebut ZwCreateEnlistment. Selain itu, Anda dapat memilih untuk membuat manajer sumber daya seperti itu volatil, seperti yang dijelaskan di bagian berikutnya dari topik ini.
Setelah manajer sumber daya memanggil ZwReadOnlyEnlistment, manajer sumber daya dapat memanggil ZwClose untuk menutup handel pendaftaran.
Membuat Volatile-Resource Manager
Manajer sumber daya volatil adalah manajer sumber daya yang tidak mempertahankan data yang tahan lama. Misalnya, Anda dapat membuat manajer sumber daya volatil untuk memantau data yang dikirim klien, jika manajer sumber daya tidak memodifikasi database yang disimpan tahan lama. Manajer sumber daya volatil biasanya tidak mencatat aktivitas transaksi dan oleh karena itu tidak dapat melakukan operasi pemulihan atau pembatalan.
Manajer sumber daya volatil harus mengatur bendera RESOURCE_MANAGER_VOLATILE saat memanggil ZwCreateResourceManager. Jika bendera ini diatur, KTM tidak mencatat informasi apa pun tentang manajer sumber daya di aliran log objek manajer transaksi terkait.
Manajer sumber daya Anda juga dapat mengatur bendera TRANSACTION_MANAGER_VOLATILE saat memanggil ZwCreateTransactionManager. Jika bendera ini diatur, KTM tidak membuat aliran log untuk objek manajer transaksi. Selain itu, setiap manajer sumber daya tambahan yang terhubung ke objek manajer transaksi juga harus volatil dan mengatur bendera RESOURCE_MANAGER_VOLATILE.
Menambahkan Resource Manager ke TPS yang Sudah Ada
Jika Anda harus menambahkan manajer sumber daya tambahan ke TPS yang ada, Anda memiliki dua pilihan:
Manajer sumber daya baru Anda memanggil ZwCreateTransactionManager untuk membuat objek manajer transaksinya sendiri.
Gunakan pilihan ini jika manajer sumber daya Anda tidak berkomunikasi dengan manajer sumber daya lain di TPS.
Manajer sumber daya baru Anda memanggil ZwOpenTransactionManager untuk terhubung ke objek manajer transaksi yang ada.
Gunakan pilihan ini jika manajer sumber daya Anda harus berkomunikasi dengan manajer sumber daya lain di TPS. Manajer sumber daya yang memanggil ZwCreateTransactionManager harus berbagi GUID objek manajer transaksi, nama aliran log, atau nama objek sehingga manajer sumber daya lain dapat memanggil ZwOpenTransactionManager. Manajer sumber daya lainnya ini dapat memanggil ZwQueryInformationTransactionManager untuk mendapatkan informasi tambahan tentang objek manajer transaksi.
Setelah Anda menambahkan manajer sumber daya ke TPS, klien yang mengetahui manajer sumber daya Anda dapat memanggil antarmuka klien resource manager.