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

Menggunakan SQL Server sebagai mekanisme penguncian sumber daya

Anda pada dasarnya menggambarkan alur kerja berbasis antrian klasik, dan Anda harus mempertimbangkan untuk menggunakan asli antrian .

Demi diskusi, inilah cara Anda mencapai apa yang Anda inginkan:

  • klaim sumber daya tertentu:SELECT ... FROM resources WITH (UPDLOCK, ROWLOCK) WHERE key = @key . Akan memblokir jika sumber daya sudah diklaim. Gunakan waktu tunggu kunci untuk mengembalikan pengecualian jika sumber daya sudah diklaim. key harus diindeks dan unik.
  • sumber daya berikutnya yang tersedia:SELECT ... FROM resources WITH (UPDLOCK, ROWLOCK, READPAST) ORDER BY <accessorder> . Anda harus menentukan urutan untuk mengekspresikan preferensi sumber daya (terlama, prioritas tertinggi, dll.)
  • melepaskan sumber daya yang diklaim:COMMIT transaksi Anda.

Inti masalahnya adalah menggunakan petunjuk kunci yang tepat, dan masalah semacam ini memang membutuhkan petunjuk kunci yang eksplisit untuk dipecahkan. UPDLOCK akan bertindak sebagai kunci 'klaim'. ROWLOCK menciptakan perincian yang tepat yang mencegah server 'mengoptimalkan' ke penguncian halaman. READPAST memungkinkan Anda untuk melewati sumber daya yang diklaim. Menempatkan UPDLOCK pada baris akan mengunci baris dan memungkinkan Anda untuk memperbaruinya nanti, tetapi akan mencegah operasi lain seperti SELECT read-commit biasa yang akan memblokir pada baris terkunci. Idenya adalah bahwa Anda tetap akan MEMPERBARUI baris, yang akan menempatkan kunci X yang tidak dapat dihindari. Jika Anda ingin membuat tabel lebih tersedia, Anda dapat menggunakan kunci aplikasi sebagai gantinya, tetapi secara signifikan lebih sulit untuk dilakukan dengan benar. Anda perlu meminta kunci aplikasi pada deskriptor string sumber daya, seperti nilai kunci, atau CHECKSUM dari kunci atau %%LOCKRES%% nilai. Kunci aplikasi memungkinkan Anda untuk memisahkan cakupan 'klaim' dari transaksi dengan meminta kunci aplikasi pada cakupan 'sesi', tetapi kemudian Anda harus melepaskan klaim secara manual (kunci aplikasi cakupan 'transaksi' dilepaskan pada waktu komit) . Perhatian, ada ribuan cara untuk menembak diri sendiri dengan kunci aplikasi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Melewati beberapa baris data ke prosedur tersimpan

  2. String Format Tanggal/Waktu Standar Didukung oleh FORMAT() di SQL Server

  3. Kesalahan overflow aritmatika dalam SQL

  4. DECRYPTBYASYMKEY() Tidak Mengembalikan Nilai yang Diharapkan

  5. Cara Terbaik untuk memanggil Layanan Web dari TSQL