SQL Server BACA SNAPSHOT BERKOMITMEN vs SNAPSHOT

23

Saya sedang meneliti perbedaan antara SQL Server READ COMMITTED SNAPSHOTdan SNAPSHOTtingkat isolasi dan menemukan sumber daya berikut:

Memilih Tingkat Isolasi Berbasis Versi Baris

Untuk sebagian besar aplikasi, baca isolasi yang dilakukan menggunakan versi baris direkomendasikan daripada isolasi snapshot karena alasan berikut:

  • Ini mengkonsumsi ruang tempdb lebih sedikit daripada isolasi snapshot.

  • Isolasi snapshot rentan terhadap pembaruan konflik yang tidak berlaku untuk membaca isolasi yang dilakukan menggunakan versi baris. Ketika transaksi yang berjalan di bawah isolasi snapshot membaca data yang kemudian dimodifikasi oleh transaksi lain, pembaruan oleh transaksi snapshot ke data yang sama menyebabkan konflik pembaruan dan transaksi berakhir dan dibatalkan. Ini bukan masalah dengan isolasi yang dilakukan baca menggunakan versi baris.

Saya agak baru dalam topik ini, tetapi sepertinya saya tidak bisa memahami dua poin utama dari tautan di atas.

  1. Mengapa ruang tempdb berbeda untuk mode ini? Apakah satu toko lebih banyak versi granular daripada yang lain?

  2. Mengapa isolasi snapshot lebih rentan untuk memperbarui konflik?

John Russell
sumber

Jawaban:

18
  1. READ COMMITTED SNAPSHOTmenggunakan snapshot baru setelah setiap pernyataan. Itu berarti bahwa versi baris yang lebih sedikit tetap hidup. (Pernyataan yang Anda kutip dari dokumen ini sedikit menyesatkan karena menunjukkan bahwa ini selalu benar - itu hanya berlaku jika terjadi SNAPSHOTtransaksi jangka panjang .) Versi baris snapshot dibuat pada penulisan. Bacaan tidak mempengaruhi apa yang dimasukkan ke dalam tempdb. Para penulis tidak mungkin dapat meramalkan bacaan apa yang akan dilakukan di masa depan. Pembaca hanya memengaruhi apa yang bisa dibersihkan.
  2. Ketika SNAPSHOTtransaksi T1menulis ke baris yang diubah oleh transaksi lain T2di waktu antara T1mulai dan T1mencoba menulis, pernyataan gagal dengan kesalahan konflik pembaruan. Ini adalah model konkurensi optimis. Dengan READ COMMITTED SNAPSHOT T1akan menunggu untuk T2melepaskan kunci-X pada baris dan melanjutkan secara normal.
usr
sumber
1
Untuk # 2, apakah aman untuk mengatakan bahwa SNAPSHOT tidak secara eksklusif mengunci pembaruan - hanya bergantung pada versi baris?
John Russell
1
@ JohnRussell memang terkunci secara eksklusif untuk mendukung rollback. Semua tulisan harus X-lock untuk memastikan bahwa baris dapat dikembalikan jika ada kemunduran.
usr
0

Satu lagi perbedaan antara snapshot dan snapshot yang dibaca adalah sebagai berikut.

  1. Foto

Di sesi pertama

SET TRAN ISOLATION LEVEL SNAPSHOT BEGIN TRAN SELECT * DARI TB1 ..... .....

Di sesi kedua

Perbarui TB1 SET NAME = NAME + 'test' Di mana id = 1

Di sesi pertama

PILIH * DARI TB1 - INI AKAN mengembalikan nama nilai untuk ID = 1, bukan nama + 'tes' KOMIT TRAN

Dalam snapshot yang sudah dibaca, pilih pertama pada sesi 1 akan mengembalikan nama untuk id = 1, dan pilih kedua akan mengembalikan nama + 'tes'.

Jadi dalam isolasi snapshot SQL SERVER melakukan snapshot di awal transaksi, dan membaca dari snapshot itu selama seluruh transaksi.

Dalam snapshot berkomitmen, snapshot diambil untuk setiap pernyataan SELECT selama transaksi.

Artashes Khachatryan
sumber