Baca berkomitmen adalah tingkat isolasi yang menjamin bahwa setiap data yang dibaca dikomit saat ini sedang dibaca. Ini hanya membatasi pembaca dari melihat bacaan 'kotor' apa pun yang bersifat perantara, tidak terikat. Itu tidak menjanjikan apa pun bahwa jika transaksi menerbitkan kembali pembacaan, akan menemukan Sama data, data bebas berubah setelah dibaca.
Pembacaan berulang adalah tingkat isolasi yang lebih tinggi, yang selain menjamin tingkat komitmen baca, juga menjamin bahwa setiap data yang dibaca tidak dapat diubah , jika transaksi membaca data yang sama lagi, ia akan menemukan data yang telah dibaca sebelumnya, tidak berubah, dan tersedia untuk dibaca.
Tingkat isolasi berikutnya, dapat dibuat serial, membuat jaminan yang lebih kuat:selain semua jaminan baca yang dapat diulang, ini juga menjamin bahwa tidak ada baru data dapat dilihat dengan membaca selanjutnya.
Katakanlah Anda memiliki tabel T dengan kolom C dengan satu baris di dalamnya, katakanlah memiliki nilai '1'. Dan anggap Anda memiliki tugas sederhana seperti berikut:
BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;
Itu adalah tugas sederhana yang mengeluarkan dua bacaan dari tabel T, dengan penundaan 1 menit di antara keduanya.
- di bawah READ COMMITTED, SELECT kedua dapat mengembalikan apa saja data. Transaksi bersamaan dapat memperbarui catatan, menghapusnya, memasukkan catatan baru. Pilihan kedua akan selalu melihat baru data.
- di bawah REPEATABLE READ SELECT kedua dijamin untuk menampilkan setidaknya baris yang dikembalikan dari SELECT pertama tidak berubah . Baris baru dapat ditambahkan oleh transaksi bersamaan dalam satu menit itu, tetapi baris yang ada tidak dapat dihapus atau diubah.
- di bawah SERIALIZABLE membaca pilihan kedua dijamin untuk melihat persis baris yang sama seperti yang pertama. Tidak ada baris yang dapat diubah, atau dihapus, atau baris baru yang dapat disisipkan oleh transaksi bersamaan.
Jika Anda mengikuti logika di atas, Anda dapat dengan cepat menyadari bahwa transaksi SERIALIZABLE, meskipun mungkin memudahkan hidup Anda, selalu sepenuhnya memblokir setiap operasi bersamaan yang mungkin, karena mereka mengharuskan tidak ada yang dapat mengubah, menghapus, atau menyisipkan baris apa pun. Tingkat isolasi transaksi default dari .Net System.Transactions
cakupannya dapat diserialkan, dan ini biasanya menjelaskan kinerja buruk yang dihasilkan.
Dan terakhir, ada juga tingkat isolasi SNAPSHOT. Tingkat isolasi SNAPSHOT membuat jaminan yang sama sebagai serializable, tetapi tidak dengan mengharuskan tidak ada transaksi bersamaan yang dapat mengubah data. Sebaliknya, itu memaksa setiap pembaca untuk melihat dunia versinya sendiri ('snapshot' itu sendiri). Ini membuatnya sangat mudah untuk diprogram serta sangat terukur karena tidak memblokir pembaruan bersamaan. Namun, manfaat itu ada harganya:konsumsi sumber daya server ekstra.
Bacaan tambahan:
- Tingkat Isolasi di Mesin Basis Data
- Efek Konkurensi
- Memilih Tingkat Isolasi Berbasis Versi Baris