Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Perubahan Tingkat Isolasi SQL Server Default

Dalam skenario Anda, saya akan merekomendasikan secara eksplisit mengatur tingkat isolasi ke snapshot - yang akan mencegah pembacaan menghalangi penulisan (sisipan dan pembaruan) dengan mencegah kunci, namun pembacaan itu akan tetap menjadi pembacaan "baik" (yaitu bukan data kotor - itu tidak sama dengan NOLOCK)

Secara umum saya menemukan bahwa di mana saya memiliki masalah penguncian dengan pertanyaan saya, saya secara manual mengontrol kunci yang diterapkan. misalnya saya akan melakukan pembaruan dengan kunci tingkat baris untuk menghindari penguncian tingkat halaman/tabel, dan mengatur bacaan saya menjadi readpast (menerima bahwa saya mungkin kehilangan beberapa data, dalam beberapa skenario yang mungkin baik-baik saja) link|edit|delete|flag

EDIT-- Menggabungkan semua komentar menjadi jawaban

Sebagai bagian dari proses pengoptimalan, server sql menghindari pembacaan komit pada halaman yang diketahuinya tidak berubah, dan secara otomatis kembali ke strategi penguncian yang lebih rendah. Dalam kasus Anda, server sql turun dari pembacaan serial menjadi pembacaan berulang.

T:Terima kasih atas info berguna tentang penurunan Level Isolasi. Dapatkah Anda memikirkan alasan apa pun yang akan menggunakan Serializable IsolationLevel sejak awal, mengingat kami tidak menggunakan transaksi eksplisit untuk SELECT - kami memahami bahwa transaksi implisit akan menggunakan ReadCommitted?

A:Secara default, SQL Server akan menggunakan Read Commmited jika itu adalah level isolasi default Anda TETAPI jika Anda tidak menentukan strategi penguncian tambahan dalam kueri Anda, pada dasarnya Anda mengatakan kepada sql server "lakukan apa yang menurut Anda terbaik, tetapi preferensi saya adalah Baca Berkomitmen". Karena SQL Server bebas untuk memilih, demikian juga untuk mengoptimalkan kueri. (Algoritme pengoptimalan di server sql sangat kompleks dan saya sendiri tidak sepenuhnya memahaminya). Tidak secara eksplisit mengeksekusi dalam suatu transaksi tidak, afaik, mempengaruhi tingkat isolasi yang digunakan sql server.

T:Satu hal terakhir, apakah masuk akal bahwa SQL Server akan meningkatkan Tingkat Isolasi (dan mungkin jumlah kunci yang diperlukan) untuk mengoptimalkan kueri? Saya juga bertanya-tanya apakah penggunaan kembali koneksi gabungan akan memengaruhi ini jika mewarisi Tingkat Isolasi yang terakhir digunakan?

A:Sql server akan melakukannya sebagai bagian dari proses yang disebut "Lock Eskalasi". Dari http://support.microsoft.com/kb/323630 , saya kutip:"Microsoft SQL Server secara dinamis menentukan kapan harus melakukan eskalasi penguncian. Saat membuat keputusan ini, SQL Server memperhitungkan jumlah penguncian yang ditahan pada pemindaian tertentu, jumlah penguncian yang ditahan oleh seluruh transaksi, dan memori yang digunakan untuk kunci di sistem secara keseluruhan Biasanya, perilaku default SQL Server menghasilkan eskalasi kunci yang terjadi hanya pada titik-titik di mana itu akan meningkatkan kinerja atau ketika Anda harus mengurangi memori kunci sistem yang berlebihan ke tingkat yang lebih masuk akal . Namun, beberapa aplikasi atau desain kueri dapat memicu eskalasi kunci pada saat yang tidak diinginkan, dan kunci tabel yang ditingkatkan dapat memblokir pengguna lain".

Meskipun eskalasi kunci tidak persis sama dengan mengubah tingkat isolasi yang dijalankan kueri, ini mengejutkan saya karena saya tidak akan mengharapkan server sql mengambil lebih banyak kunci daripada yang diizinkan oleh tingkat isolasi default.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menghapus baris dalam tabel yang berisi kunci asing ke tabel lain

  2. Salah satu item yang diidentifikasi dalam format yang tidak valid - Microsoft.SqlServer.Type

  3. Menerima panjang kolom yang tidak valid dari klien bcp untuk colid 6

  4. Membuat versi database SQL Server

  5. Memilih dari tabel di mana nama dilewatkan sebagai variabel