Pertimbangan Pemrograman untuk Transactional NTFS

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

Perubahan file mana yang 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 isi file, metadata, atau namespace sistem file, seperti perubahan pada kompresi atau defragmentasi, tidak ditransaksikan. Perubahan ini tidak diisolasi 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 menyimpan nama file ketika transaksi dilakukan atau digulung balik.

Menghapus File

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

Catatan

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

Menghapus Direktori

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

Catatan

Batasan yang sama ada untuk handel terbuka pada operasi direktori yang ditransaksikan 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 penggantian nama hingga transaksi berakhir. Artinya, sistem mencegah Anda mengganti nama hingga transaksi dilakukan atau digulung balik. Upaya untuk mengganti nama direktori yang merupakan leluhur menjadi 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 menghitung, 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 ditransaksikan yang memanggil fungsi FindFirstFile atau FindNextFile tidak akan melihat file yang baru dibuat sampai transaksi berkomitmen.

File yang Dipetakan Memori

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

Aliran Bernama

Aliran bernama sepenuhnya transaksi, tetapi penguncian dilakukan pada tingkat file, bukan tingkat aliran. Penulis dari luar transaksi yang mencoba memodifikasi aliran apa pun dalam file terkunci 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 reparse 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 rentang 6700 hingga 6799. Transactional NTFS (TxF) menggunakan kode kesalahan Windows dalam rentang 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 fungsi CreateFileTransacted 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 Transaksi

TxF menyediakan fungsi baru yang ditransaksikan yang mengambil nama file, dan mengubah perilaku fungsi API I/O file yang ada yang mengambil handel file.

Fungsi Yang Ditransaksikan

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

Misalnya, fungsi CreateFile sekarang memiliki versi yang ditransaksikan: CreateFileTransacted.

Fungsi I/O File Diubah Oleh TxF

Tabel berikut mencantumkan fungsi yang perilakunya terpengaruh oleh Transactional NTFS. Misalnya, perilaku fungsi ReadFile akan bervariasi tergantung pada apakah parameter hFile dibuat oleh fungsi CreateFile atau fungsi CreateFileTransacted .

Fungsi Deskripsi
CloseHandle
Aplikasi harus menutup semua handel yang terikat pada transaksi sebelum transaksi dilakukan. Aplikasi harus menutup handel yang ditransaksikan yang dibuka dengan FILE_FLAG_DELETE_ON_CLOSE sebelum melakukan transaksi agar operasi penghapusan terjadi.
CreateFileMapping
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 ditransaksikan. Aplikasi harus memanggil FlushViewOfFile, membatalkan peta semua tampilan, dan menutup semua handel ke objek pemetaan file sebelum melakukan perubahan yang ditransaksikan.
FindNextFile
Jika ada transaksi yang terikat ke handel enumerasi file, maka file yang dikembalikan 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 terikat ke handel file, maka fungsi mengembalikan informasi untuk tampilan file 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 mengembalikan FILE_SUPPORTS_TRANSACTIONS di lpFileSystemFlags.
MapViewOfFile dan MapViewOfFileEx
Jika ada transaksi yang terkait dengan handel file yang digunakan untuk membuat objek pemetaan file yang sedang dipetakan, tampilan terkait akan ditransaksikan. Jika tampilan digunakan untuk membuat perubahan yang ditransaksikan ke file, maka pengguna harus memanggil FlushViewOfFile, menutup objek pemetaan file, dan menutup handel file sebelum melakukan transaksi terkait.
ReadDirectoryChangesW
Jika ada transaksi yang terikat ke handel 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 handel file, maka fungsi mengembalikan data dari tampilan file yang ditransaksikan. Handel baca yang ditransaksikan dijamin untuk menampilkan tampilan file yang sama selama durasi handel.
SetEndOfFile
Jika ada transaksi yang terikat pada handel, maka perubahan posisi akhir file ditransaksikan.
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 pada handel, maka perubahan nama pendek file akan ditransaksikan.
SetFileTime
Jika ada transaksi yang terikat pada handel, maka perubahan waktu file ditransaksikan.
WriteFile, WriteFileEx, dan WriteFileGather
Jika ada transaksi yang terikat ke handel file, maka penulisan file akan ditransaksikan.