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

Bagaimana cara menghilangkan kebuntuan dalam aplikasi SQL Server 2005 dan C#?

Saya tidak dapat melihat ruang lingkup transaksi eksplisit dalam kode Anda, jadi saya tidak tahu kunci apa yang sudah ada saat Anda melakukan pembaruan; juga tidak jelas tingkat isolasi apa yang Anda gunakan. Tetapi skenario yang paling umum dalam situasi seperti ini adalah bahwa sebelumnya dalam transaksi yang sama Anda telah mengeluarkan pilihan (baca kunci) pada baris yang sama yang Anda coba perbarui nanti. Ini akan menyebabkan eskalasi penguncian, dan dapat mengakibatkan kebuntuan jika dua transaksi mencoba melakukan hal yang sama:

  1. Transaksi A:pilih dengan read lock
  2. Transaksi B:pilih dengan readlock
  3. Transaksi A:update - ingin mengeskalasi read lock menjadi awrite lock, tetapi harus menunggu transaksi B melepaskan readlock
  4. Transaksi B:update - ingin mengeskalasi read lock menjadi awrite lock, tetapi harus menunggu transaksi A melepaskan readlock-nya.

Bingo! kebuntuan karena A dan B saling menunggu untuk melepaskan kunci baca yang ada sebelum mereka dapat melakukan pembaruan.

Untuk mencegah hal ini, Anda memerlukan petunjuk updlock di pilihan Anda, mis.,

select * from table with (updlock) where blah blah

Ini akan memastikan pilihan Anda menggunakan kunci tulis alih-alih kunci baca, yang akan mencegah eskalasi kunci antara transaksi bersamaan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kerangka Entitas/Linq ke SQL:Lewati &Ambil

  2. Bagaimana cara mengontrol sniffing parameter dan/atau petunjuk kueri dalam kerangka entitas?

  3. Cara membaca dan menganalisis rencana eksekusi SQL Server

  4. SQL find set dengan anggota umum (divisi relasional)

  5. Tidak dapat memulai transaksi terdistribusi