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

Kelola Konkurensi Transaksi Menggunakan Kunci di SQL Server

Dalam lingkungan multi-pengguna, sangat penting untuk menjaga konkurensi pemotongan. Kunci ini adalah struktur dalam memori berukuran 96 byte. Peran mereka adalah untuk menjaga integritas data, konsistensi, kontrol konkurensi untuk setiap transaksi. SQL Server mengikuti tes ACID untuk setiap transaksi.

  • A tomicity:Properti ini memastikan bahwa transaksi yang melibatkan dua atau lebih proses dilakukan sepenuhnya, atau tidak ada proses yang dilakukan.
  • C onsistency:Ini memberi Anda jaminan tentang status transaksi yang dilakukan. Suatu transaksi harus membuat status data baru atau kembali ke status yang ada (sebelum transaksi).
  • Saya solation:Ini menunjukkan bahwa transaksi terisolasi satu sama lain. Jika transaksi sedang berjalan dan tidak melakukan commit data, transaksi tersebut diisolasi dari transaksi lain.
  • D urability:Daya tahan memastikan data komitmen Anda tidak pernah hilang. Ini mencegah kegagalan daya dan sistem operasi, atau kesalahan yang disebabkan oleh perangkat lunak lainnya.

Untuk memastikan properti ACID, SQL Server menerapkan berbagai jenis kunci pada objek. Dalam hal ini, transaksi lain harus menunggu hingga kunci dilepaskan.

Mode Penguncian

SQL Server menggunakan mode penguncian berikut untuk setiap transaksi.

  • Kunci bersama:
    • Dalam kunci ini, SQL Server memungkinkan sesi lain untuk melakukan operasi yang dipilih untuk membaca data. Namun, ini mencegah pembaruan hingga kunci aktif.
    • Beberapa transaksi dapat menerapkan kunci bersama secara bersamaan pada satu baris atau halaman.
    • Ini adalah kunci umum yang Anda lihat pada objek database Anda.

Dalam T-SQL berikut, kami mengambil data pelanggan untuk ID pelanggan tertentu. Selanjutnya, kami menggunakan tampilan manajemen dinamis sys.dm_tran_locks untuk memeriksa kunci yang ada.

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (HOLDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK

Seperti yang ditunjukkan di bawah ini, ia memiliki kunci bersama pada id sumber daya yang diberikan (8194443284a0):

  • Kunci eksklusif (X):
    • SQL Server menggunakan kunci eksklusif (X) untuk operasi DML (Hapus, Sisipkan, atau Perbarui), yang memerlukan modifikasi data baris atau halaman.
    • Ini mencegah penggunaan lain mengakses sumber daya sampai kunci ditempatkan.
    • SQL Server hanya dapat memiliki satu kunci eksklusif pada satu halaman atau baris untuk sebuah transaksi.

Dalam contoh ini, kami ingin memperbarui catatan untuk id pelanggan 1. Oleh karena itu, SQL Server memerlukan kunci eksklusif pada sumber daya. Tidak ada transaksi lain yang dapat memperoleh kunci eksklusif pada sumber daya ini sampai transaksi selesai.

BEGIN TRAN
UPDATE [SalesLT].[Customer] 
SET Suffix='Mr.'  
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Perbarui (U) kunci:
    • Kunci Pembaruan mirip dengan kunci eksklusif. Itu dapat ditempatkan pada rekaman yang memiliki kunci bersama.
    • Kunci pembaruan menempatkan kunci bersama lainnya pada baris tertentu. Setelah dapat mengubah catatan, SQL Server mengonversi kunci Pembaruan menjadi kunci Eksklusif.
    • SQL Server tidak dapat menempatkan kunci bersama pada sumber daya dengan kunci Pembaruan.
    • Anda juga dapat menggunakan WITH UPDLOCK untuk memaksa kunci pembaruan.

Contoh berikut menunjukkan kunci pembaruan pada id sumber daya (8194443284a0):

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (UPDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Penguncian maksud:
    • Tujuannya adalah untuk menginformasikan transaksi tentang niatnya untuk memperoleh kunci. Itu terjadi ketika transaksi memerlukan kunci bersama atau eksklusif pada sumber daya yang lebih rendah dalam hierarki.
    • Transaksi tidak mengizinkan transaksi lain untuk mendapatkan kunci eksklusif di atas meja menggunakan kunci maksud.
    • Jenis kunci maksud ada di bawah.
      • Kunci Intent Shared (IS):Ini menunjukkan niat SQL Server untuk membaca sumber daya hierarki yang lebih rendah dengan memperoleh kunci bersama secara individual pada sumber daya hierarki yang lebih rendah tersebut.
      • Intent Exclusive (IX) lock:Ini menunjukkan niat SQL Server untuk memodifikasi sumber daya hierarki yang lebih rendah dengan mendapatkan kunci eksklusif pada sumber daya hierarki yang lebih rendah tersebut.
      • Intent Update lock (IU):Ini dapat diperoleh di tingkat halaman hanya untuk sumber daya hierarkis yang lebih rendah, dan setelah pembaruan selesai, itu akan diubah menjadi kunci IX.

Seperti yang ditunjukkan di bawah, transaksi memiliki kunci eksklusif pada kunci, dan memiliki kunci eksklusif Intent pada tingkat halaman.

Kunci Konversi

SQL Server mengonversi tipe kunci untuk mendukung beberapa kueri dalam suatu transaksi. Kunci ini dikenal sebagai kunci konversi.

  • ENAM – Dibagi dengan Intent Kunci Eksklusif:Transaksi SQL Server menyimpan kunci bersama di beberapa halaman dan memiliki eksklusif mengunci beberapa baris.
  • SIU – Transaksi SQL Server memiliki kunci bersama di beberapa halaman dan memiliki Pembaruan mengunci beberapa baris.
  • UIX- Update with Intent Exclusive Lock:Transaksi SQL Server menahan kunci Update di beberapa halaman dan memiliki Eksklusif mengunci beberapa baris.

Kunci Skema

SQL Server memperoleh dua jenis kunci skema.

  • Kunci stabilitas skema (Sch-S):Kunci ini digunakan saat kueri yang bergantung pada skema dikompilasi, dan rencana eksekusinya sedang dibuat. Kunci Sch-S tidak memblokir akses apa pun ke data objek.
  • Kunci modifikasi skema (Sch-M):Kunci ini dihasilkan dari eksekusi kueri DDL (Bahasa Definisi Data). SQL Server hanya dapat memiliki satu kunci modifikasi skema pada suatu objek. Anda tidak dapat mengubah objek dengan kunci skema ini.

Pada contoh di bawah, kita mendapatkan kunci Sch-S dan Sch-M saat memodifikasi definisi objek.

BEGIN TRAN
Alter TABLE DemoTable ADD new bit
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'
ROLLBACK

Kompatibilitas Kunci

Kompatibilitas kunci berguna untuk memeriksa kunci yang diizinkan jika terjadi beberapa transaksi dalam sumber daya yang sama secara bersamaan. Jika suatu transaksi menempatkan kunci, kunci baru yang ditempatkan oleh transaksi lain harus kompatibel dengannya. Oleh karena itu, Anda dapat melihat daftar kompatibilitas kunci berikut dan menemukan kunci yang didukung selama beberapa transaksi.

Kunci Eskalasi

SQL Server memperkenalkan fitur eskalasi kunci untuk mencegah terlalu banyak penguncian yang dapat menyebabkan tekanan memori. SQL Server mempertimbangkan jumlah kunci yang dipegang pada pemindaian tertentu dan jumlah kunci yang dipegang oleh seluruh transaksi dan memori secara dinamis. SQL Server mengonversi kunci tingkat rendah menjadi kunci tingkat tinggi dalam eskalasi kunci. Misalnya, ini mengubah kunci baris menjadi kunci tingkat halaman.

Ini menggunakan ambang batas berikut untuk eskalasi penguncian.

  • Ambang batas memori: Ambang batas memori kunci disetel pada 40 persen dari memori kunci.
  • Ambang Kunci: Jika jumlah kunci yang diperoleh pada tabel atau indeks saat ini lebih besar dari 5000, eskalasi kunci dapat dipicu.

Pengguna dapat mengontrol eskalasi kunci menggunakan pernyataan tabel ubah. Anda dapat sepenuhnya menonaktifkan eskalasi kunci untuk tabel tersebut menggunakan nilai parameter DISABLE.

ALTER TABLE Table_name SET (LOCK_ESCALATION = < TABLE | AUTO | DISABLE > –One of those options) GO

Anda dapat merujuk ke dokumentasi Microsoft untuk memahami eskalasi kunci secara mendetail.

Catatan:Anda tidak boleh menonaktifkan eskalasi penguncian sampai benar-benar diuji di lingkungan yang lebih rendah, dan disarankan untuk digunakan hanya oleh DBA berpengalaman.

Kesimpulan

Artikel ini memberikan gambaran rinci tentang kunci SQL Server dan DMV untuk memantau kunci dan proses eskalasinya. Mengunci adalah perilaku yang cukup normal di SQL Server, dan Anda harus terbiasa dengannya untuk memahami cara kerja beberapa transaksi, mensimulasikan, dan menyediakan data yang konsisten.


  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 Menemukan Collation di SQL Server (T-SQL)

  2. Kesalahan SSMS 2016 Mengimpor Azure SQL v12 bacpac:kunci master tanpa kata sandi tidak didukung

  3. Tweet Lucu Tentang Kehidupan DBA

  4. Cara Mengembalikan Semua Batasan Kunci Asing yang Dinonaktifkan di SQL Server (Contoh T-SQL)

  5. Hubungkan ke SQL Server melalui PDO menggunakan SQL Server Driver