SQL Server - tingkat isolasi apa untuk pernyataan pilih yang tidak menghalangi?


9

Saya memiliki transaksi yang berjalan lama (disebut, katakanlah, T1) yang melakukan beberapa penghapusan, pembaruan, dan sisipan pada tabel di SQL Server 2008 R2. Pada saat yang sama, proses lain secara berkala menjalankan pernyataan pilih dari tabel ini.

Di bawah pengaturan isolasi default (BACA KOMITMEN, saya pikir?), T1 memblokir setiap pernyataan pilihan dari berjalan sampai transaksi dilakukan atau dibatalkan.

Yang ingin saya lihat adalah pernyataan pilih berfungsi pada data yang konsisten bahkan saat transaksi sedang berlangsung. Saya percaya isolasi SNAPSHOT dapat membantu, tetapi saya tidak yakin apakah saya akan ke arah yang benar. Apakah ini akan menjadi tingkat isolasi terbaik untuk aplikasi ini?

Kedua, saya tidak memiliki kontrol atas proses yang memanggil pernyataan pilih, tetapi saya memiliki kontrol atas aplikasi .NET yang memanggil T1. Apakah perubahan level isolasi diperlukan pada pernyataan pilih dan T1, atau apakah itu cukup untuk menandai hanya T1 yang memiliki level isolasi yang berbeda?

Jawaban:


8

Di dunia yang ideal Anda akan memiliki dua pilihan, SNAPSHOT dan READ COMMITTED SNAPSHOT (RCSI). Pastikan Anda memahami dasar-dasar tingkat isolasi transaksi sebelum Anda memutuskan mana yang sesuai untuk beban kerja Anda. Secara khusus waspadai hasil yang berbeda yang mungkin Anda lihat sebagai hasil dari pindah ke RCSI.

Sepertinya ini bukan dunia yang ideal karena Anda tidak memiliki kendali atas aplikasi yang menghasilkan pernyataan pilih. Dalam hal ini, satu-satunya pilihan Anda adalah mengaktifkan RCSI untuk basis data yang dimaksud sehingga para pemilih akan secara otomatis menggunakan RCSI alih-alih BACA BERKOMITMEN.


6

Benar, gunakan isolasi SNAPSHOT untuk mendapatkan data yang konsisten dan berkomitmen dari sebelum transaksi dimulai.

Isolasi BACA TIDAK DIKOMPITASI (alias petunjuk NOLOCK) akan membaca data dirtz, tidak konsisten

Saat Anda mengaktifkan isolasi SNAPSHOT, maka itu akan berlaku untuk semua SELECT yang akan datang. Anda menjalankan ALTER DATABASEdengan READ_COMMITTED_SNAPSHOT dalam kasus ini

Sunting: tautan ditambahkan + kutipan dari ALTER DATABASE (huruf tebal saya)

Mengaktifkan opsi Snapshot yang Dibaca Baca pada level database. Ketika diaktifkan, pernyataan DML mulai menghasilkan versi baris bahkan ketika tidak ada transaksi yang menggunakan Isolasi Snapshot. Setelah opsi ini diaktifkan, transaksi yang menentukan tingkat isolasi yang dilakukan dengan komitmen menggunakan versi baris alih-alih mengunci. Ketika transaksi berjalan pada tingkat isolasi yang dilakukan, semua pernyataan melihat snapshot data seperti yang ada di awal pernyataan.

Dan dari Menggunakan Isolasi Snapshot ( cetak tebal saya)

Opsi basis data READ_COMMITTED_SNAPSHOT menentukan perilaku tingkat isolasi BACA KOMITMEN standar BACA ketika isolasi snapshot diaktifkan dalam database. Jika Anda tidak secara eksplisit menentukan READ_COMMITTED_SNAPSHOT ON, READ COMMITTED diterapkan untuk semua transaksi implisit. Ini menghasilkan perilaku yang sama seperti pengaturan READ_COMMITTED_SNAPSHOT OFF (default). Ketika READ_COMMITTED_SNAPSHOT OFF berlaku, Mesin Database menggunakan kunci bersama untuk menegakkan tingkat isolasi default. Jika Anda mengatur opsi database READ_COMMITTED_SNAPSHOT ke ON, mesin database menggunakan versi baris dan isolasi snapshot sebagai default, alih-alih menggunakan kunci untuk melindungi data.

Jadi iya.

Mengaktifkan RCSI akan memungkinkan pembacaan untuk mendapatkan data yang konsisten dan tidak diblokir oleh penulis yang akan terus menggunakan Komitmen Baca


4

Saya sarankan Anda membaca pertanyaan berikut dan jawabannya: Masalah penguncian basis data? .

Menemukan tingkat isolasi yang tepat untuk digunakan pada tingkat db adalah hal tercepat yang dapat Anda lakukan sekarang untuk membantu Anda memperbaiki masalah ini, karena sekarang sulit untuk mengubah semua aplikasi yang menyentuh database dan mengubah kode mereka. Karena Anda berkata "Saya tidak memiliki kendali atas proses yang memanggil pernyataan pilih", jawaban tercepat adalah dengan mengalihkan db ke tingkat isolasi Snapshot yang Dibaca Baca, sehingga Anda tidak akan menyentuh kueri bacaan. Kalau tidak, Anda harus menggunakan tingkat isolasi Snapshot untuk sesi yang membaca data selama transaksi besar Anda.

Lebih detail di sini tentang memilih yang benar: Memilih Level Isolasi Berbasis Versi Baris .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.