Pertimbangan Pemrograman untuk Transactional NTFS

Untuk deskripsi berbagai pertimbangan pemrograman untuk Transactional NTFS, lihat bagian berikut:

File mana yang perubahannya ditransaksikan?

Sebagian besar perubahan file, seperti perubahan pada konten file, aliran, titik pemisahan ulang, atribut, dan namespace sistem file, ditransaksikan. Ketika salah satu perubahan ini dilakukan pada handel file yang ditransaksikan, perubahan diisolasi dari transaksi lain, dan perubahan dibatalkan jika transaksi digulung balik.

Perubahan yang tidak memengaruhi konten file, metadata, atau namespace sistem file, seperti perubahan pada kompresi atau defragmentasi, tidak ditransaksikan. Perubahan ini tidak terisolasi dari transaksi lain, dan tidak dibatalkan jika transaksi digulung balik.

Kompresi

Status pemadatan file yang dibuka dalam transaksi tidak dapat diubah.

Membuat File atau Direktori

File atau direktori yang dibuat dalam transaksi tidak terlihat oleh apa pun di luar transaksi saat ini. Di luar transaksi ini, setiap upaya untuk membuat file dengan nama yang sama gagal dengan kesalahan ERROR_TRANSACTIONAL_CONFLICT, secara efektif menahan nama file untuk ketika transaksi di-commit atau dibatalkan.

Menghapus File

File atau direktori yang dihapus dengan memanggil fungsi DeleteFileTransacted tetap terlihat oleh semua pembaca luar.

Nota

Semua handel yang ditransaksikan ke file harus ditutup sebelum akhir transaksi. Jika handel tidak ditutup dengan benar, penghapusan tidak terjadi. Semua handle terbuka ke file harus ditutup sebelum melakukan komitmen agar operasi penghapusan dianggap sebagai bagian dari transaksi. Ini karena sistem tidak benar-benar menghapus file sampai penanganan terakhir ditutup, bahkan ketika operasi tidak ditransaksikan, hal ini terjadi sebagai bagian dari subsistem I/O file Windows.

Menghapus Direktori

Direktori yang dihapus dengan memanggil fungsiRemoveDirectoryTransacted tetap terlihat oleh semua pembaca luar.

Nota

Batasan yang sama berlaku untuk handle terbuka pada operasi direktori transaksi seperti pada file. Untuk informasi selengkapnya, lihat Menghapus File.

Masalah Penguncian Direktori

Jika file dimodifikasi dalam transaksi, semua komponen direktori jalur ke file disebut sebagai disematkan terhadap perubahan nama hingga transaksi berakhir. Artinya, sistem mencegah Anda mengganti nama mereka sampai transaksi telah diselesaikan atau dibatalkan. Upaya untuk mengganti nama direktori yang merupakan leluhur dari file yang telah dimodifikasi dalam transaksi yang sedang berlangsung akan gagal dengan kesalahan ERROR_CANT_BREAK_TRANSACTIONAL_DEPENDENCY.

Enumerasi Direktori

Konten direktori dapat diubah saat enumerasi sedang berlangsung sebagai akibat dari penggunaan API yang menomori, misalnya fungsi FindFirstFileTransacted dan FindNextFile.

Perubahan pada direktori di luar transaksi tidak terisolasi dari transaksi dan segera terlihat dalam transaksi. Misalnya, jika penulis yang tidak ditransaksikan menambahkan file ke direktori, file baru segera terlihat di dalam transaksi sehingga memanggil fungsi FindFirstFileTransacted atau FindNextFile akan mengembalikan file baru.

Perubahan yang dilakukan pada direktori di dalam transaksi diisolasi hingga transaksi dilakukan. Misalnya, file yang dibuat di direktori sebagai bagian dari transaksi. Pembaca yang tidak bertransaksi yang memanggil fungsi FindFirstFile atau FindNextFile tidak akan melihat file yang baru dibuat sampai transaksinya dikonfirmasi.

Berkas Memory-Mapped

Klien harus memanggil fungsi FlushViewOfFile, menutup objek pemetaan file, dan menutup handle file sebelum melakukan transaksi terkait pada file yang dipetakan memori.

Aliran Tertentu

Stream bernama sepenuhnya transaksional, tetapi penguncian dilakukan pada tingkat file, bukan tingkat stream. Penulis di luar transaksi yang mencoba memodifikasi stream mana pun dalam file terkunci akan menerima kesalahan ERROR_SHARING_VIOLATION.

Anda tidak dapat mengganti nama aliran sekunder dalam transaksi.

Mengganti nama File atau Direktori

Untuk mengganti nama file sebagai operasi yang ditransaksikan, panggil MoveFileTransacted untuk memindahkan file.

Pilah Ulang Titik

Perubahan pada titik pemisahan ulang ditransaksikan, yang berarti bahwa jika titik pemisahan ulang baru ditetapkan ke file dalam transaksi, itu tidak terlihat oleh transaksi lain. Demikian pula, perubahan atau penghapusan titik pemisahan ulang yang ada tidak terlihat sampai penerapan.

Kode Kesalahan

Kernel Transaction Manager (KTM) menggunakan kode kesalahan sistem dalam kisaran 6700 hingga 6799. Transactional NTFS (TxF) menggunakan kode kesalahan Windows dalam kisaran 6800 hingga 6899. Untuk informasi selengkapnya, lihat WinError.h dan Kode Kesalahan Sistem (6000-8199).

Sistem File Terenkripsi

TxF tidak mendukung operasi pada file EFS. Anda tidak dapat membuka file terenkripsi EFS untuk transaksi. Memanggil fungsiCreateFileTransacted pada file EFS akan gagal dengan kesalahan ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION. Demikian pula, memanggil fungsi EncryptFile pada file dalam transaksi akan gagal dengan kesalahan ERROR_EFS_NOT_ALLOWED_IN_TRANSACTION.

Fungsi I/O File dan NTFS Transaksional

TxF menyediakan fungsi bertransaksi baru yang mengambil nama berkas, dan mengubah perilaku fungsi API I/O berkas yang ada yang mengambil pegangan berkas.

Fungsi Yang Ditransaksikan

Jika Anda tidak memanggil salah satu fungsi yang ditransaksikan berikut sebagai pengganti versi yang tidak ditransaksikan, operasi tidak akan ditransaksikan:

Misalnya, fungsiCreateFile sekarang memiliki versi yang ditransaksikan: CreateFileTransacted.

Fungsi I/O File Diubah Oleh TxF

Tabel berikut mencantumkan fungsi yang perilakunya dipengaruhi oleh Transactional NTFS. Misalnya, perilaku fungsiReadFile akan bervariasi tergantung pada apakah parameter hFile dibuat oleh fungsiCreateFile atau fungsiCreateFileTransacted.

Fungsi Deskripsi
CloseHandle
Aplikasi harus menutup semua handle yang terikat pada transaksi sebelum transaksi dikonfirmasi. Aplikasi harus menutup handle transaksi yang dibuka dengan FILE_FLAG_DELETE_ON_CLOSE sebelum menyelesaikan transaksi agar operasi penghapusan dapat dilakukan.
BuatPemetaanFile
Jika ada transaksi yang terkait dengan hFile, maka objek pemetaan file yang dibuat fungsi ini akan dikaitkan dengan transaksi yang sama. Modifikasi yang dilakukan melalui tampilan objek pemetaan file ini diproses. Aplikasi harus memanggil FlushViewOfFile, melepaskan pemetaan semua tampilan, dan menutup semua handle ke objek pemetaan file sebelum melakukan perubahan yang ditransaksikan.
FindNextFile
Jika ada transaksi yang terikat ke penangan enumerasi file, maka file yang dikembalikan akan tunduk pada aturan isolasi transaksi.
FSCTL_SET_COMPRESSION
Anda tidak dapat mengubah status pemadatan file yang dibuka oleh CreateFileTransacted.
GetFileInformationByHandle dan GetFileInformationByHandleEx
Jika ada transaksi yang terkait dengan pengendali berkas, maka fungsi mengembalikan informasi untuk tampilan berkas yang terisolasi.
GetFileSize dan GetFileSizeEx
Jika ada transaksi yang terikat ke handel file, maka fungsi mengembalikan informasi untuk tampilan file yang terisolasi.
GetVolumeInformation
Jika volume mendukung transaksi sistem file, fungsi akan mengembalikan FILE_SUPPORTS_TRANSACTIONS di dalam lpFileSystemFlags.
MapViewOfFile dan MapViewOfFileEx
Jika ada transaksi yang terkait dengan penanganan berkas yang digunakan untuk membuat objek pemetaan berkas yang sedang dipetakan, maka tampilan terkait tersebut adalah hasil transaksi. Jika tampilan digunakan untuk membuat perubahan yang ditransaksikan ke file, maka pengguna harus memanggil FlushViewOfFile, tutup objek pemetaan file, dan tutup handel file sebelum melakukan transaksi terkait.
ReadDirectoryChangesW
Jika ada transaksi yang terikat ke pegangan direktori, maka pemberitahuan mencerminkan tampilan direktori yang terisolasi. Perubahan pada file di luar tampilan direktori yang ditransaksikan tidak disertakan dalam pemberitahuan.
ReadFile, ReadFileEx, dan ReadFileScatter
Jika ada transaksi yang terikat ke file handle, maka fungsi mengembalikan data dari sudut pandang transaksi file tersebut. Handle baca bersifat transaksi dijamin menampilkan tampilan file yang sama sepanjang masa berlaku handle.
SetEndOfFile
Jika ada transaksi yang terikat ke handle, maka perubahan posisi akhir file akan diproses sebagai transaksi.
SetFileInformationByHandle
Jika ada transaksi yang terikat pada handel, maka perubahan yang dilakukan akan ditransaksikan untuk kelas informasi FileBasicInfo, FileRenameInfo, FileAllocationInfo, FileEndOfFileInfo, dan FileDispositionInfo.
SetFileShortName
Jika ada transaksi yang terikat ke handel, maka perubahan nama pendek file akan diproses sebagai transaksi.
SetFileTime
Jika ada transaksi yang terikat pada handle, maka perubahan waktu file akan ditransaksikan.
WriteFile, WriteFileEx, dan WriteFileGather
Jika ada transaksi yang terikat ke handle file, maka penulisan file diproses sebagai transaksi.