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

Bingung tentang UPDLOCK, HOLDLOCK

Mengapa UPDLOCK memblokir pilihan? Matriks Kompatibilitas Kunci dengan jelas menunjukkan N untuk pertikaian S/U dan U/S, seperti dalam Tidak Ada Konflik .

Adapun petunjuk HOLDLOCK, dokumentasi menyatakan:

HOLDLOCK:Setara dengan SERIALIZABLE. Untuk informasi lebih lanjut, lihat SERIALIZABLEnanti di topik ini.

...

SERIALIZABLE:... Pemindaian dilakukan dengan semantik yang sama dengan transaksi yang berjalan pada tingkat isolasi SERIALIZABLE...

dan topik Tingkat Isolasi Transaksi menjelaskan arti SERIALIZABLE:

Tidak ada transaksi lain yang dapat mengubah data yang telah dibaca oleh transaksi saat ini hingga transaksi saat ini selesai.

Transaksi lain tidak dapat menyisipkan baris baru dengan nilai kunci yang akan berada dalam kisaran kunci yang dibaca oleh pernyataan apa pun dalam transaksi saat ini hingga transaksi saat ini selesai.

Oleh karena itu, perilaku yang Anda lihat dijelaskan dengan sempurna oleh dokumentasi produk:

  • UPDLOCK tidak memblokir SELECT atau INSERT secara bersamaan, tetapi memblokir setiap UPDATE atau DELETE dari baris yang dipilih oleh T1
  • HOLDLOCK berarti SERALIZABLE dan oleh karena itu memungkinkan SELECT, tetapi memblokir UPDATE dan DELETES dari baris yang dipilih oleh T1, juga sebagai INSERT apa pun dalam rentang yang dipilih oleh T1 (yang merupakan seluruh tabel, oleh karena itu apa saja sisipkan).
  • (UPDLOCK, HOLDLOCK):eksperimen Anda tidak menunjukkan apa yang akan diblokir selain kasus di atas, yaitu transaksi lain dengan UPDLOCK di T2 :
    SELECT * FROM dbo.Test WITH (UPDLOCK) WHERE ...
  • TABLOCKX tidak perlu penjelasan

Pertanyaan sebenarnya adalah apa yang ingin Anda capai ? Bermain dengan petunjuk kunci tanpa pemahaman lengkap 110% tentang semantik penguncian menimbulkan masalah...

Setelah OP edit:

Saya ingin memilih baris dari tabel dan mencegah data di tabel itu diubah saat saya memprosesnya.

Anda harus menggunakan salah satu tingkat isolasi transaksi yang lebih tinggi. REPEATABLE READ akan mencegah data yang Anda baca diubah. SERIALIZABLE akan mencegah data yang Anda baca agar tidak diubah dan data baru dari yang dimasukkan. Menggunakan tingkat isolasi transaksi adalah pendekatan yang tepat, dibandingkan dengan menggunakan petunjuk kueri. Kendra Little memiliki poster bagus yang menjelaskan tingkat isolasi.



  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 Mengonversi Huruf Besar ke Huruf Kecil di SQL Server – LOWER()

  2. Buat Hubungan di SQL Server 2017

  3. Tiga Kemenangan Kinerja SQL Server yang Mudah

  4. SQL Server Internal:Rencana Caching Pt. I – Menggunakan Kembali Paket

  5. Menulis CTE Rekursif menggunakan sintaks Entity Framework Fluent atau sintaks Inline