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

Esensi dan penggunaan petunjuk NOLOCK di SQL Server

Ide utama dari mekanisme penguncian SQL Server adalah mengontrol konsistensi transaksi. Menurut prinsip ini, jika suatu proses ingin melakukan operasi penyisipan, penghapusan, atau pembaruan, mesin SQL Server mengunci baris atau baris dan tidak mengizinkan proses lain hingga transaksi selesai. Dalam beberapa keadaan, mekanisme penguncian ini dapat menyebabkan masalah kinerja seperti tekanan proses bersamaan yang tinggi. Sehingga Anda dapat mengalami kebuntuan (Deadlock adalah masalah konkurensi di mana dua transaksi ingin mengakses data yang sama secara bersamaan) masalah dalam database Anda. Pada artikel ini, kami akan fokus pada cara menghindari masalah kunci dengan bantuan petunjuk NOLOCK. Pertama, mari pelajari esensi utama dan detail metodologi pembacaan kotor karena petunjuk NOLOCK dapat menyebabkan pembacaan kotor.

Bacaan Kotor: Dalam metodologi pembacaan ini, proses pembacaan membaca data yang tidak dikomit dan proses pembacaan tidak memperdulikan transaksi yang terbuka sehingga penguncian tidak menyebabkan masalah apa pun dalam proses pembacaan. Akibatnya, jenis pembacaan ini mengurangi masalah penguncian. Namun, metodologi pembacaan kotor memiliki pro dan kontra karena pembacaan kotor dapat menyebabkan masalah inkonsistensi dalam kumpulan hasil pernyataan SELECT. Seperti yang telah disebutkan, kumpulan hasil ini dapat menyertakan data transaksi yang tidak dikomit, oleh karena itu kita harus mempertimbangkan pembacaan kotor saat memutuskan untuk melakukan pembacaan semacam ini. Kami tidak dapat memastikan keakuratan baris yang kami buat selama pembacaan kotor karena baris ini dapat digulung kembali. Di sisi lain, jenis pembacaan ini memungkinkan kita untuk menghindari masalah penguncian dan meningkatkan kinerja SQL Server.

NOLOCK: Tingkat isolasi default SQL Server adalah Baca Berkomitmen dan di tingkat isolasi ini SQL Server tidak mengizinkan untuk membaca objek terkunci yang dikunci oleh transaksi yang tidak terikat. Selain itu, objek yang dikunci ini dapat diubah sesuai dengan eskalasi penguncian.

Catatan:Dalam konsep utama artikel penguncian SQL Server ini, Anda dapat menemukan detail tentang penguncian dan eskalasi penguncian.

Bayangkan Anda memiliki dua pengguna basis data dan pengguna ini ingin menjalankan pembaruan dan memilih operasi terhadap basis data. Pengguna pertama mulai memperbarui baris tertentu dalam tabel dan kemudian pengguna lain ingin membaca baris yang sama. Kedua pengguna ini menjalankan pembaruan berikut dan memilih pernyataan, yang diilustrasikan pada gambar di bawah ini.

Dalam hal ini, pengguna2 menunggu setidaknya 10 detik dan kemudian transaksi akan dibatalkan oleh pengguna1, dan kemudian user2 dapat membaca baris hijau karena baris terkunci akan dilepaskan oleh pengguna1. Ini adalah perilaku default dari tingkat isolasi SQL Server Read Committed.

Sekarang, kami akan mendemonstrasikan kasus ini di SQL Server. Pertama-tama, kita akan membuat tabel FruitSales dan baris-barisnya.

BUAT TABEL Penjualan Buah(Id ID INT (1,1) KUNCI UTAMA, [Nama] Varchar(20) ,Total Penjualan Float)GOINSERT INTO FruitSales VALUES('Apple',10) ,('Oranye',8), ( 'Pisang',2)

Pada langkah ini, kita akan membuka dua jendela kueri SQL Server Management Studio dan menjalankan kueri pengguna1 dan kemudian menjalankan kueri pengguna2.

 ---USER1----MULAI PEMBARUAN TRANSAKSI FruitSales SET SalesTotal =20 WHERE Id=2 TUNGGU PENUNDAAN '00:00:10'TRANSAKSI ROLLBACK ---USER2----SET STATISTIK WAKTU ONSELECT * DARI FruitSales MANA Id=2

Seperti yang Anda lihat pada gambar di atas, kueri kedua menunggu hingga pengembalian transaksi pengguna1.

Sekarang, kita akan membahas petunjuk NOLOCK dan detail penggunaan. Petunjuk NOLOCK adalah petunjuk tabel paling populer yang digunakan oleh pengembang dan administrator basis data untuk menghilangkan masalah kunci dalam basis data SQL Server. Dengan bantuan petunjuk tabel NOLOCK, kita dapat membaca objek terkunci (baris, halaman atau tabel) yang dikunci oleh transaksi terbuka. Petunjuk NOLOCK mengesampingkan perilaku default pengoptimal kueri SQL Server sehingga pernyataan pilih dapat membaca objek yang dikunci.

Sekarang, kita akan menambahkan petunjuk NOLOCK ke pernyataan pemilihan pengguna2 dan kemudian memulai pembaruan pengguna1 dan kemudian menjalankan pernyataan pemilihan pengguna2.

---USER1----MULAI PEMBARUAN TRANSAKSI FruitSales SET SalesTotal =20 WHERE Id=2 WAITFOR DELAY '00:00:10'ROLLBACK TRANSACTION ---USER2----SET STATISTIK WAKTU ONSELECT * DARI FruitSales DENGAN (NOLOCK) WHERE Id=2

Pada langkah ini, kami akan menjelaskan bagaimana memengaruhi petunjuk NOLOCK pada pernyataan pilih pengguna2. Pengguna1 mengeksekusi pernyataan yang diperbarui dalam transaksi eksplisit dan kemudian pengguna2 mengeksekusi pernyataan pilih dan set hasil mengembalikan tanpa penundaan penyelesaian transaksi. Ini adalah ide utama NOLOCK, ia membaca objek yang terkunci.

Sekarang, kita akan fokus pada kumpulan hasil dari pernyataan pilih. Pernyataan pilih user2 mengambil nilai SalesTotal 20 tetapi nilai sebenarnya dari SalesTotal masih 8. Perlu diingat bahwa jika Anda menggunakan petunjuk tabel NOLOCK dalam pernyataan pilih, Anda mungkin menghadapi jenis hasil data yang tidak akurat ini.

Kiat: Kata kunci “WITH” adalah fitur yang tidak digunakan lagi, jadi Microsoft menyarankan untuk tidak menggunakannya dalam pengembangan database baru Anda dan menghapus kata kunci “WITH” dalam pengembangan Anda saat ini. Anda dapat menemukan penggunaan petunjuk NOLOCK tanpa kata kunci “DENGAN”.

---USER1----BEGIN TRAN UPDATE SET Penjualan Buah Total Penjualan =20 WHERE Id=2 WAITFOR DELAY '00:00:10'ROLLBACK TRANSACTIONSELECT * FROM FruitSales WHERE Id=2 --USER2---SELECT * FROM FruitSales (NOLOCK) WHERE Id=2

Selain itu, petunjuk tabel READUNCOMMITTED setara dengan petunjuk NOLOCK dan kita dapat menggunakan petunjuk READUNCOMMITTED sebagai ganti petunjuk NOLOCK.

PILIH * FROM FruitSales (READUNCOMMITTED) WHERE Id=2

Meski begitu, ada kasus khusus tentang petunjuk NOLOCK yang tidak bisa melewati penghalang penguncian. Jika ada proses yang mengubah tabel, petunjuk NOLOCK tidak dapat mengatasi jenis kunci ini dan tidak dapat melanjutkan operasi pembacaan. Alasan untuk masalah ini adalah bahwa petunjuk NOLOCK memperoleh kunci Sch-S (stabilitas skema) dan pernyataan ALTER TABLE memperoleh kunci SCH-M (modifikasi skema), sehingga terjadi konflik.

Pada awalnya, kita akan mempelajari tabel Object_Id dari FruitSales dengan bantuan query berikut.

pilih OBJECT_ID('FruitSales')

Jalankan kueri pengguna1 berikut, lalu jalankan kueri pengguna2. Akibatnya, kueri user2 akan menunda penyelesaian proses pengubahan tabel user1.

--USER1---BEGIN TRANALTER TABLE FruitSalesADD ColorofFruit varchar(200) WAITFOR DELAY '00:00:35GOCOMMIT TRAN --USER2---SELECT * FROM FruitSales (NOLOCK) WHERE Id=2

Buka jendela kueri baru dan jalankan kueri berikut. Kueri ini akan membantu untuk mengetahui jenis kunci dari kueri pengguna1 dan pengguna2.

SELECT Resource_type, Resource_database_id, Resource_description, Resource_associated_entity_id, Resource_lock_partition, Request_mode, Request_type, Request_status, Request_session_id, Request_request_id, Request_owner_type, Request_owner_id, Lock_owner_addressFROM sys.dm_tran_locksidm_76_tran_lockdimanakan 

Sekarang, kita akan memeriksa matriks kompatibilitas kunci untuk interaksi SCH-M dan SCH-S. Matriks tersebut menjelaskan bahwa interaksi SCH-M dan SCH-S menyebabkan konflik.

Kesimpulan

Pada artikel ini, kami menyebutkan proses membaca kotor dan petunjuk NOLOCK. Menggunakan petunjuk NOLOCK adalah metode yang efektif untuk membaca halaman yang terkunci tetapi juga memiliki beberapa kelebihan dan kekurangan. Untuk alasan ini, Anda harus mempertimbangkan petunjuk NOLOCK sebelum menggunakannya.

Referensi

Panduan Penguncian Transaksi SQL Server dan Pembuatan Versi Baris

Petunjuk (Transact-SQL) – Tabel

SET TINGKAT ISOLASI TRANSAKSI (Transact-SQL)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menilai Pengaturan Pemantauan Kinerja Basis Data Anda

  2. Perbaiki "Kesalahan overflow aritmatika mengonversi ekspresi ke tipe data int" di SQL Server

  3. MONTH() Contoh di SQL Server (T-SQL)

  4. Bagaimana cara menambahkan xml encoding <?xml version=1.0 encoding=UTF-8?> ke xml Output di SQL Server

  5. Bagaimana cara memeriksa apakah string adalah pengidentifikasi unik?