Sebagian besar forum dan contoh online selalu menyarankan untuk memiliki keduanya ALLOW_SNAPSHOT_ISOLATION
dan READ_COMMITTED_SNAPSHOT
diatur ke AKTIF setiap kali seseorang meminta snapshot, versi baris atau pertanyaan serupa.
Saya kira kata SNAPSHOT di kedua pengaturan menjadi sedikit membingungkan. Saya berpikir bahwa, agar mesin database menggunakan versi baris alih-alih kunci untuk perilaku default READ_COMMITTED, database READ_COMMITTED_SNAPSHOT
diatur ke ON terlepas dari ALLOW_SNAPSHOT_ISOLATION
pengaturan apa .
The ALLOW_SNAPSHOT_ISOLATION
pengaturan diatur ke ON hanya untuk memungkinkan isolasi snapshot ketika memulai transaksi (misalnya SET TRANSAKSI ISOLASI TINGKAT SNAPSHOT) terlepas dari READ_COMMITTED_SNAPSHOT
pengaturan.
Satu-satunya alasan untuk menetapkan kedua pengaturan ini menjadi AKTIF adalah ketika harus memiliki READ COMMITTED versi baris DAN isolasi snapshot.
Pertanyaan saya adalah, apakah pemahaman saya salah dalam beberapa hal? Dan bahwa kedua pengaturan ini harus selalu disetel ke AKTIF bersama (terutama untuk versi baris BACA BERKOMITMEN)?
Oke, pulang dan diuji. Inilah pengamatannya.
Tes pertama dengan kedua pengaturan dikonfirmasi OFF.
Pertanyaan 1
Pertanyaan 2
Dalam pengujian ini, permintaan 2 sedang menunggu permintaan 1 untuk melakukan, dm_tran_locks DMV menunjukkan bahwa kunci eksklusif pada TABLE1 yang dikeluarkan oleh permintaan 1.
Tes kedua , kembalikan transaksi sebelumnya, setel READ_COMMITTED_SNAPSHOT ON tetapi biarkan ALLOW_SNAPSHOT_ISOLATION OFF.
Jalankan Kueri 1, dan jalankan kueri 2. DMV menampilkan kueri 1 mengeluarkan kunci eksklusif, tetapi kueri 2 mengembalikan detail dengan 'Asli' tanpa kueri 1 melakukan transaksi. Tampaknya READ_COMMITTED versi baris sudah ada.
Menambahkan
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
kueri 1 dan kueri 2, dan menjalankan kueri 1 atau kueri 2 mengembalikan kesalahan - Transaksi isolasi snapshot gagal mengakses database 'TEST' karena isolasi snapshot tidak diperbolehkan dalam database ini. Gunakan ALTER DATABASE untuk memungkinkan isolasi snapshot.Tes ketiga , kembalikan transaksi sebelumnya. Setel OFF READ_COMMITTED_SNAPSHOT dan ALLOW_SNAPSHOT_ISOLATION ON.
Jalankan kueri 1, lalu kueri 2. DMV memperlihatkan kunci eksklusif yang ditimbulkan oleh kueri 1. Kueri 2 tampaknya menunggu kueri 1 selesai. Menghidupkan ALLOW_SNAPSHOT_ISOLATION ON tampaknya tidak mengaktifkan READ COMMITTED versi baris.
Menambahkan
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
ke kueri 1 dan kueri 2. Jalankan kueri 1 dan kemudian kueri 2. Sementara DMV menunjukkan kueri 1 mengeluarkan kunci eksklusif, kueri 2 mengembalikan detail dengan 'Asli'. Isolasi snapshot tampaknya ada di tempatnya.Pengamatan dari tes menunjukkan bahwa
READ_COMMITTED_SNAPSHOT
itu sendiri mengaktifkan / menonaktifkan versi baris READ COMMITTED terlepas dariALLOW_SNAPSHOT_ISOLATION
pengaturan, dan sebaliknya.sumber
Pemahaman Anda benar. Saya suka definisi singkat, bersih dan sederhana dari sini :
Sepertinya banyak kesalahpahaman berasal dari MS itu sendiri. Sebagai contoh, di sini mereka berkata:
Tetapi "isolasi snapshot" yang disebutkan tidak sama dengan perilaku transaksi yang
set transaction isolation level snapshot
diterapkan.Adapun perbedaannya, penjelasan yang bagus ada di sini .
Mungkin akan lebih baik jika READ_COMMITTED_SNAPSHOT dinamai sebagai READ_COMMITTED_ROW_VERSIONING atau sesuatu seperti itu. :)
sumber
Saya suka ringkasan ini dari Microsoft :
sumber