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

Apa itu SQL Server Deadlock?

Ada banyak alasan mengapa aplikasi mungkin lambat merespons, tetapi jika pengguna mengeluh tentang kinerja, Anda mungkin menghadapi kebuntuan SQL Server. Untungnya, ada cara untuk mengidentifikasi dan memperbaiki kebuntuan SQL Server, dan bahkan mencegahnya agar tidak memengaruhi kinerja aplikasi secara negatif.

Kebuntuan SQL Server pada dasarnya adalah kebuntuan antara dua proses yang bersaing untuk akses eksklusif ke sumber daya yang sama. Karena hanya satu proses yang dapat menggunakan sumber daya pada satu waktu, kinerja melambat hingga kebuntuan teratasi.

Ada dua jenis kebuntuan SQL Server yang harus diperhatikan:kunci konversi dan kunci siklus.

Kebuntuan kunci konversi terjadi saat utas mencoba mengonversi kunci dari satu jenis eksklusif ke jenis eksklusif lainnya, tetapi tidak bisa karena utas yang berbeda sudah memegang kunci bersama pada sumber daya yang coba dikonversi oleh utas pertama.

Di SQL Server, ada tiga jenis kunci konversi:

  • Dibagikan dengan niat eksklusif (ENAM):Kunci ini terjadi saat transaksi yang memiliki kunci bersama juga memiliki kunci eksklusif di beberapa halaman atau baris.
  • Shared with intent update (SIU):Kunci ini terjadi saat transaksi yang memiliki kunci bersama juga memiliki beberapa halaman atau baris yang dikunci dengan kunci update.
  • Update with intent exclusive (UIX):Penguncian ini terjadi saat transaksi yang memiliki kunci pembaruan juga memiliki kunci eksklusif pada beberapa halaman atau baris.

Kunci siklus adalah kebuntuan SQL Server yang disebabkan oleh dua proses yang bersaing untuk mendapatkan kunci eksklusif pada sumber daya yang dikunci oleh proses lainnya.

Misalnya, Proses 1 menahan kunci pada Sumber Daya 1 sambil menunggu Proses 2 melepaskan kuncinya pada Sumber Daya 2. Jika Proses 2 menahan kunci pada Sumber Daya 2 sambil menunggu Proses 1 melepaskan Sumber Daya 1, kita mendapatkan diri kita sendiri kebuntuan kunci siklus.

Cara Mendiagnosis SQL Server Deadlock

Kebuntuan SQL Server hanyalah salah satu dari lusinan kemungkinan alasan aplikasi Anda mungkin mengalami masalah kinerja. Jika kueri yang biasanya berjalan cepat tiba-tiba melambat, ada kemungkinan Anda mengalami kebuntuan. Tapi itu juga mungkin sesuatu yang lain sedang terjadi.

Jadi, selain memperhatikan kecepatan kueri yang berkurang, bagaimana Anda menentukan dengan pasti apakah kebuntuan adalah penyebab masalah kinerja database Anda?

Cara termudah dan paling pasti untuk mengidentifikasi kebuntuan adalah adanya pesan kesalahan 1205:

Transaksi (ID Proses %d) menemui jalan buntu pada sumber daya %.*ls dengan proses lain dan telah dipilih sebagai korban kebuntuan. Jalankan kembali transaksi.

Pesan kesalahan 1205 secara harfiah memberi tahu Anda bahwa ada kebuntuan dan cara memperbaikinya. Namun, seperti yang ditunjukkan Jeremiah Peschka, jika Anda belum memperbaiki penyebab kebuntuan, menjalankan kembali transaksi mungkin tidak akan berhasil.

Pilihan lain untuk menemukan kebuntuan adalah dengan menarik grafik kebuntuan SQL Server dari Acara yang Diperpanjang. Mengekstrak kebuntuan melalui Extended Events memungkinkan Anda melihat XML kebuntuan, yang memberikan lebih banyak informasi daripada representasi grafis dari grafik kebuntuan.

XML kebuntuan diatur oleh daftar korban, daftar proses, dan daftar sumber daya. Setiap bagian memberikan deskripsi mendetail tentang korban, proses, dan sumber daya yang terlibat dalam kebuntuan, yang memudahkan pemecahan masalah dan penyelesaian masalah.

Cara Memperbaiki SQL Server Deadlock

Satu-satunya cara untuk menyelesaikan kebuntuan SQL Server adalah dengan menghentikan salah satu proses dan membebaskan sumber daya yang terkunci sehingga proses dapat diselesaikan. Ini terjadi secara otomatis ketika SQL Server mendeteksi kebuntuan dan mematikan salah satu proses yang bersaing (yaitu, korban).

SQL Server biasanya memilih koneksi mana yang akan dimatikan secara acak, tetapi dimungkinkan untuk menetapkan prioritas kebuntuan untuk menentukan koneksi mana yang dimatikan selama kebuntuan. Ketika dua koneksi memiliki pengaturan prioritas yang berbeda, SQL Server akan mematikan transaksi dengan prioritas terendah.

Cara Mencegah SQL Server Deadlock

Kebuntuan SQL Server adalah fakta kehidupan saat Anda mengelola database yang sibuk. Namun, DBA dapat membantu mengurangi terjadinya kebuntuan dan meminimalkan dampaknya terhadap kinerja basis data dengan mengambil beberapa tindakan pencegahan:

  • Buat indeks yang lebih baik
  • Sesuaikan prioritas transaksi
  • Aktifkan model Coba/Coba Lagi
  • Ubah mode isolasi
  • Tahan kunci dalam waktu sesingkat mungkin
  • Akses sumber daya dalam urutan yang sama setiap saat
  • Jangan mengirimkan transaksi sampai Anda memiliki semua informasi yang Anda butuhkan
  • Batasi eskalasi penguncian

Meskipun tidak mungkin untuk mencegah kebuntuan SQL Server sepenuhnya, Anda dapat menerapkan praktik terbaik ini dan secara proaktif menghindari beberapa sumber kebuntuan yang paling umum untuk menjaga agar transaksi tetap lancar dan mengoptimalkan kinerja basis data.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kembalikan semua kemungkinan kombinasi nilai pada kolom di SQL

  2. pisahkan alfa dan numerik menggunakan sql

  3. 4 Kegiatan Pemantauan Basis Data Utama Yang Harus Diketahui Setiap DBA

  4. Tambahkan kolom dengan nilai default ke tabel yang ada di SQL Server

  5. Cadangkan Database di SQL Server 2017