it-swarm.asia

Apa yang menghalangi dan bagaimana itu terjadi?

Saya mencoba untuk menemukan beberapa informasi tentang pemblokiran dalam SQL Server, tetapi saya tidak dapat menemukan penjelasan singkat untuk apa itu dan bagaimana hal itu terjadi. Bisakah Anda mencerahkan saya?

20
jrara

Analogi

Terkadang membantu menggunakan analogi yang jauh dari komputer.

Katakanlah Anda punya bola dan dua anak. Hanya satu anak yang dapat memiliki bolanya pada satu waktu. Namun, jika salah satu dari anak-anak mendapatkan bola dan tidak melepaskannya karena dia terganggu (menonton TV, misalnya), maka anak yang lain tidak akan bisa bermain dengan bola.

Anak lainnya diblokir dari sumber itu.

Jika kita membandingkan ini dengan TV, misalnya, beberapa anak dapat menonton TV pada satu titik.

Kunci

Jika kita pindah ke dunia basis data, kita melihat bahwa ada berbagai cara untuk menggunakan sumber daya (seperti dua contoh di atas). Kita dapat melakukan "membaca" atau kita dapat melakukan "menulis".

Ketika kami ingin membaca data, tidak ada alasan orang lain tidak dapat membaca data juga - seperti dua orang yang menonton TV. Namun, jika kita ingin menulis data, maka kita perlu memastikan bahwa tidak ada orang lain yang melihatnya. Jika mereka membacanya saat kami sedang menulis, mereka akan mendapatkan "kotor" bacaan. (Artinya, mereka akan melihat data yang sebagian ditulis, yang tidak valid.)

Untuk memastikan bahwa pembacaan yang kotor ini tidak pernah terjadi, kami memiliki dua jenis kunci utama, Baca Kunci dan Kunci Eksklusif.

Baca Kunci

Anda dapat memiliki beberapa koneksi berbeda yang membaca dari sumber data yang sama pada waktu tertentu. Tetapi untuk memastikan bahwa tidak ada yang mengubah data saat mereka membacanya, mereka mengeluarkan Kunci Baca.

Setelah koneksi memiliki kunci baca pada sepotong data, semua koneksi lain harus menunggu sampai Kunci Baca dirilis sebelum mereka dapat tulis data. Namun, yang lain bisa mengambil Baca Kunci mereka sendiri pada sepotong data yang sama.

Kunci Eksklusif

Jika koneksi ingin memperbarui/memasukkan/menghapus data, mereka harus mengeluarkan kunci eksklusif. Ini mencegah koneksi lain dari mengeluarkan kunci pada data (membuat kunci eksklusif untuk koneksi itu).

Ketika suatu koneksi memiliki kunci eksklusif pada data, tidak ada koneksi lain dapat membaca dari data. Ini membantu mencegah pembacaan kotor dengan memastikan bahwa tidak ada yang dapat membaca data saat sedang ditulis.

Memblokir

"Memblokir" hanyalah sebuah istilah yang berarti bahwa satu koneksi memegang kunci pada sumber daya ketika koneksi lain ingin membaca atau menulis padanya. Itu tidak selalu berarti bahwa koneksi pemilik tidak akan melepaskannya, hanya saja itu saat ini menahannya.

Bandingkan ini dengan kasing anak yang memegang bola. Anak yang memegang bola menghalangi semua anak lain dari memegang bola.

Jalan buntu

Saya tahu Anda tidak menanyakan hal ini, tetapi hanya satu langkah lagi untuk mencapai kebuntuan (dan ini terkait langsung dengan pemblokiran).

Kebuntuan dapat terjadi ketika Anda memiliki dua koneksi yang masing-masing memiliki kunci, tetapi mereka menginginkan satu sama lain sumber daya. Dalam skenario ini, seperti dua anak yang masing-masing memiliki bola, tetapi menginginkan bola yang lain.

Seperti anak-anak, koneksi ini tidak mau berbagi sama sekali. Setiap koneksi membutuhkan akses ke kedua sumber daya untuk melanjutkan. Namun, mereka dalam keadaan memblokir permanen. Dalam keadaan ini, orang tua (DBMS) harus datang dan memilih seorang pecundang sehingga salah satu anak (koneksi) dapat memiliki akses ke kedua sumber daya.

Setelah koneksi "menang" selesai, ia melepaskan sumber daya dan kemudian koneksi lain ("kehilangan") dapat mencoba lagi untuk mencapai kedua sumber tersebut.

Jadi, konsep kebuntuan adalah di mana Anda memiliki dua sumber daya yang saling menghalangi.


Di Sini , Anda dapat membaca lebih lanjut tentang semua jenis kunci yang ditawarkan SQL Server dan berbagai sumber daya yang dapat menyebabkan pemblokiran/kebuntuan. Artikel ini sudah tua, tetapi masih berlaku untuk SQL Server 2000 hingga 2008 R2. (Ada beberapa jenis kunci yang ditambahkan ke versi SQL Server yang lebih baru, tetapi itu akan memberi Anda titik awal.)

23
Richard

Penjelasan hebat dari Richard, tetapi hanya ingin menambahkan tautan ke dokumentasi resmi. Topik-topik ini ditulis untuk SQL Server 2000, tetapi banyak konsep tetap sama hari ini:

Memahami dan Menghindari Pemblokiran

Memahami Mengunci dalam SQL Server

Edit - beberapa tambahan:

Ketiga adalah penulis SQL Server dan/atau MVP yang sangat terkenal.

5
Aaron Bertrand