Bagaimana SQL Server menentukan urutan yang diperlukan saat memilih tabel?

10

Saya memiliki dua prosedur tersimpan yang menemui jalan buntu ketika sistem sedang dimuat. Proc A memilih dari tabel sementara Proc B memasukkan ke dalam tabel yang sama. Grafik Kunci menunjukkan bahwa Proc A memiliki kunci halaman mode S yang Proc B menginginkan kunci mode IX, namun Proc A sedang menunggu kunci halaman mode S untuk halaman yang berbeda yang Proc B sudah memiliki kunci halaman mode IX aktif. .

Jelas ini bisa disortir dengan memastikan bahwa kedua kueri mengunci halaman di tabel dalam urutan yang sama, tapi saya tidak tahu bagaimana melakukannya.

Pertanyaan saya adalah: Bagaimana SQL Server menentukan urutan untuk mengunci halaman saat melakukan INSERT dan SELECT dan bagaimana Anda dapat memodifikasi perilaku ini?

Martin Brown
sumber

Jawaban:

2

Bagaimana SQL Server menentukan urutan untuk mengunci halaman saat melakukan INSERT dan SELECT a

Tidak ditentukan - dilakukan oleh pemrosesan internal dan bergantung pada output optimizer permintaan.

dan bagaimana Anda bisa memodifikasi perilaku ini?

Kontrol isolasi Anda. Jika Anda membaca untuk menulis, beri tahu SQL Server untuk segera mendapatkan kunci tulis. Titik ditutup.

TomTom
sumber
1

Saat ini, proc A memiliki kunci bersama.

"Tidak ada transaksi lain yang dapat mengubah data sementara kunci (S) bersama ada di sumber daya." http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

Jika Anda menggunakan sql 2005 atau lebih tinggi, coba gunakan isolasi snapshot.

"Level isolasi snapshot menggunakan versi baris untuk memberikan konsistensi membaca level transaksi. Operasi baca tidak memperoleh kunci halaman atau baris; hanya kunci tabel SCH-S yang diperoleh. Saat membaca baris yang dimodifikasi oleh transaksi lain, mereka mengambil versi baris yang ada saat transaksi dimulai. Anda hanya dapat menggunakan isolasi Snapshot terhadap basis data ketika opsi basis data ALLOW_SNAPSHOT_ISOLATION disetel AKTIF. Secara default, opsi ini disetel MATI untuk basis data pengguna. " http://msdn.microsoft.com/en-us/library/ms189122.aspx

Karena hanya kunci Sch-S yang diperoleh, 'baca Anda seharusnya tidak dapat memblokir penulisan' Anda.

"Kunci stabilitas skema (Sch-S) tidak menghalangi kunci transaksional, termasuk kunci eksklusif (X)." http://msdn.microsoft.com/en-us/library/ms189122.aspx

Perlu diingat, Level Isolasi Snapshot banyak menggunakan tempdb untuk versi baris, jadi ukurlah dengan tepat dan patuhi praktik terbaik untuk strategi disk tempdb.

brian
sumber