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

Konsep utama penguncian SQL Server

Dalam posting ini, kita akan membahas mekanisme kunci SQL Server dan cara memantau penguncian SQL Server dengan tampilan manajemen dinamis standar SQL Server. Sebelum kita mulai menjelaskan arsitektur kunci SQL Server, mari luangkan waktu sejenak untuk menjelaskan apa itu database ACID (Atomicity, Consistency, Isolation, dan Durability). Basis data ACID dapat dijelaskan sebagai teori basis data. Jika database disebut database relasional, itu harus memenuhi persyaratan Atomicity, Consistency, Isolation, dan Durability. Sekarang, kami akan menjelaskan persyaratan ini secara singkat.

Atomitas :Ini mencerminkan prinsip indivisibility yang kami gambarkan sebagai fitur utama dari proses transaksi. Blok transaksi tidak dapat dibiarkan tanpa pengawasan. Setengah dari blok transaksi yang tersisa menyebabkan inkonsistensi data. Entah seluruh transaksi dilakukan atau transaksi kembali ke awal. Artinya, semua perubahan yang dilakukan oleh transaksi dibatalkan dan dikembalikan ke keadaan sebelumnya.

Konsistensi :Ada aturan yang menetapkan substruktur dari aturan non-divisibility. Data transaksi harus memberikan konsistensi. Artinya, jika operasi pembaruan dilakukan dalam suatu transaksi, semua transaksi yang tersisa harus dilakukan atau operasi pembaruan harus dibatalkan. Data ini sangat penting dalam hal konsistensi.

Isolasi :Ini adalah paket permintaan untuk setiap database transaksi. Perubahan yang dibuat oleh paket permintaan harus terlihat oleh transaksi lain sebelum selesai. Setiap transaksi harus diproses secara terpisah. Semua transaksi harus terlihat oleh transaksi lain setelah terjadi.

Daya tahan: Transaksi dapat melakukan operasi kompleks dengan data. Untuk mengamankan semua transaksi ini, mereka harus tahan terhadap kesalahan transaksi. Masalah sistem yang mungkin terjadi di SQL Server harus disiapkan dan tahan terhadap kegagalan daya, sistem operasi, atau kesalahan yang disebabkan oleh perangkat lunak lainnya.

Transaksi: Transaksi adalah tumpukan terkecil dari proses yang tidak dapat dibagi menjadi bagian-bagian yang lebih kecil. Juga, beberapa kelompok proses transaksi dapat dilakukan secara berurutan tetapi seperti yang kami jelaskan dalam prinsip Atomicity jika salah satu transaksi gagal, semua blok transaksi akan gagal.

Kunci: Kunci adalah mekanisme untuk memastikan konsistensi data. SQL Server mengunci objek saat transaksi dimulai. Ketika transaksi selesai, SQL Server melepaskan objek terkunci. Mode kunci ini dapat diubah sesuai dengan jenis proses SQL Server dan tingkat isolasi. Mode kunci ini adalah:

Hirarki kunci: SQL Server memiliki hierarki kunci yang memperoleh objek kunci dalam hierarki ini. Database terletak di bagian atas hierarki dan baris terletak di bagian bawah. Gambar di bawah mengilustrasikan hierarki kunci SQL Server.

Kunci Bersama (S): Jenis kunci ini terjadi ketika objek perlu dibaca. Jenis kunci ini tidak menyebabkan banyak masalah.

Kunci Eksklusif (X): Ketika jenis penguncian ini terjadi, itu terjadi untuk mencegah transaksi lain untuk mengubah atau mengakses objek yang dikunci.

Perbarui (U) Kunci: Jenis kunci ini mirip dengan kunci eksklusif tetapi memiliki beberapa perbedaan. Kami dapat membagi operasi pembaruan ke dalam fase yang berbeda:fase baca dan fase tulis. Selama fase baca, SQL Server tidak ingin transaksi lain memiliki akses ke objek ini untuk diubah. Untuk alasan ini, SQL Server menggunakan kunci pembaruan.

Intent Lock: Kunci maksud terjadi saat SQL Server ingin memperoleh kunci bersama (S) atau kunci eksklusif (X) pada beberapa sumber daya yang lebih rendah dalam hierarki kunci. Dalam praktiknya, saat SQL Server memperoleh kunci pada halaman atau baris, kunci maksud diperlukan dalam tabel.

Setelah semua penjelasan singkat ini, kami akan mencoba menemukan jawaban tentang cara mengidentifikasi kunci. SQL Server menawarkan banyak tampilan manajemen dinamis untuk mengakses metrik. Untuk mengidentifikasi kunci SQL Server, kita dapat menggunakan sys.dm_tran_locks melihat. Dalam tampilan ini, kami dapat menemukan banyak informasi tentang sumber daya pengelola kunci yang saat ini aktif.

Pada contoh pertama, kita akan membuat tabel demo yang tidak menyertakan indeks apa pun dan mencoba memperbarui tabel demo ini.

CREATE TABLE TestBlock(Id INT ,Nm VARCHAR(100))INSERT INTO TestBlockvalues(1,'CodingSight')Dalam langkah ini, kita akan membuat transaksi terbuka dan menganalisis sumber daya yang terkunci.BEGIN TRANUPDATE TestBlock SET Nm='NewValue_CodingSight ' di mana Id=1pilih @@SPID

Sekarang, kita akan memeriksa tampilan sys.dm_tran_lock.

pilih * dari sys.dm_tran_locks MANA request_session_id=74

Tampilan ini mengembalikan banyak informasi tentang sumber daya kunci aktif. Tetapi tidak mungkin untuk memahami beberapa data dalam pandangan ini. Untuk alasan ini, kita harus bergabung dengan sys.dm_tran_locks tampilan ke tampilan lain.

Pre> Pilih dm_tran_locks.request_session_id, dm_tran_locks.resource_database_id, db_name (dm_tran_locks.resource_name, dM), dm1, casing, indexes.name AS index_name, dm_tran_locks.resource_type, dm_tran_locks.resource_description, dm_tran_locks.resource_associated_entity_id, dm_tran_locks.request_mode, dm_tran_locks.request_statusFROM sys.dm_tran_locksLEFT JOIN sys.partitions ON partitions.hobt_id =dm_tran_locks.resource_associated_entity_idLEFT JOIN sys.indexes ON indexes.OBJECT_ID =partitions .OBJECT_ID AND indexes.index_id =partitions.index_idWHERE resource_associated_entity_id> 0 AND resource_database_id =DB_ID() and request_session_id=74ORDER BY request_session_id, resource_associated_entity_id

Pada gambar di atas, Anda dapat melihat sumber daya yang terkunci. SQL Server memperoleh kunci eksklusif di baris itu. (RID :Pengidentifikasi baris yang digunakan untuk mengunci satu baris dalam heap) Pada saat yang sama, SQL Server memperoleh kunci eksklusif maksud di halaman dan TestBlock meja. Ini berarti bahwa proses lain tidak dapat membaca sumber ini sampai SQL Server melepaskan kunci. Ini adalah mekanisme kunci dasar di SQL Server.

Sekarang, kami akan mengisi beberapa data sintetis pada tabel pengujian kami.

TRUNCATE TABLE TestBlockDECLARE @K AS INT=0WHILE @K <8000BEGININSERT TestBlock VALUES(@K, CAST(@K AS varchar(10)) + ' Value' )SET @[email protected]+1 ENDSetelah menyelesaikan langkah ini , kita akan menjalankan dua kueri dan memeriksa tampilan sys.dm_tran_locks.BEGIN TRAN UPDATE TestBlock set Nm ='New_Value' where Id<5000

Dalam kueri di atas, SQL Server memperoleh kunci eksklusif di setiap baris. Sekarang, kita akan menjalankan kueri lain.

BEGIN TRAN UPDATE TestBlock set Nm ='New_Value' di mana Id<7000

Dalam kueri di atas, SQL Server membuat kunci eksklusif di atas meja, Karena SQL Server mencoba memperoleh banyak kunci RID untuk baris ini yang akan diperbarui. Kasus ini menyebabkan banyak konsumsi sumber daya di mesin database. Oleh karena itu, SQL Server secara otomatis memindahkan kunci eksklusif ini ke objek tingkat atas yang ada dalam hierarki kunci. Kami mendefinisikan mekanisme ini sebagai Eskalasi Kunci. Kunci Eskalasi dapat diubah di tingkat tabel.

ALTER TABLE XX_TableNameSET( LOCK_ESCALATION =AUTO -- atau TABLE atau DISABLE)GO

Saya ingin menambahkan beberapa catatan tentang eskalasi kunci. Jika Anda memiliki tabel yang dipartisi, maka kita dapat mengatur eskalasi ke level partisi.

Pada langkah ini, kita akan menjalankan kueri yang membuat kunci di tabel AdventureWorks HumanResources. Tabel ini memiliki indeks berkerumun dan tidak berkerumun.

MULAI PEMBARUAN TRANS [HumanResources].[Department] SET Name='NewName' where DepartmentID=1

Seperti yang Anda lihat di panel hasil di bawah ini, transaksi kami memperoleh kunci eksklusif di kunci indeks cluster PK_Department_DepartmentID dan juga memperoleh kunci eksklusif di kunci indeks non-clustered AK_Department_Name. Sekarang, kita dapat mengajukan pertanyaan ini “Mengapa SQL Server mengunci indeks yang tidak berkerumun?”

Nama kolom diindeks dalam indeks non-clustered AK_Department_Name dan kami mencoba mengubah Nama kolom. Dalam hal ini, SQL Server perlu mengubah indeks yang tidak berkerumun di kolom itu. Tingkat daun indeks yang tidak berkerumun mencakup setiap nilai KUNCI yang diurutkan.

Kesimpulan

Pada artikel ini, kami menyebutkan jalur utama mekanisme kunci SQL Server dan mempertimbangkan penggunaan sys.dm_tran_locks. Tampilan sys.dm_tran_locks mengembalikan banyak informasi tentang sumber daya kunci yang sedang aktif. Jika Anda google, Anda dapat menemukan banyak contoh pertanyaan tentang tampilan ini.

Referensi

Penguncian Transaksi SQL Server dan Panduan Pembuatan Versi Baris

SQL Server, Mengunci Objek


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pendekatan terbaik untuk menjalankan total – diperbarui untuk SQL Server 2012

  2. SQL antara tidak inklusif

  3. Perbaiki Msg 8114 "Kesalahan mengonversi tipe data varchar ke numerik" di SQL Server

  4. Operator Ampersand (&) dalam SQL Server WHERE Clause

  5. Cara Menghapus Akun Email Database dari Profil di SQL Server (T-SQL)