Apa yang menghalangi dan bagaimana itu terjadi?

20

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?

jrara
sumber

Jawaban:

23

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 yang lain 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 menulisnya, mereka akan mendapatkan "kotor" bacaan. (Artinya, mereka akan melihat data yang sebagian ditulis, yang tidak valid.)

Untuk memastikan bahwa pembacaan 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 menulis data. Namun, yang lain dapat 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 juga 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.

Pemblokiran

"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 lainnya ("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.)

Richard
sumber
1
@ Richard, seperti yang Anda sebutkan jika terjadi kebuntuan, maka DBMS akan masuk dan memilih pecundang .. Apakah ini dilakukan secara otomatis oleh DBMS? Atau apakah sistem yang dirancang dengan buruk (yang sering mengalami kebuntuan) berhenti sampai seseorang menginisiasi DBMS untuk melakukannya?
CenterOrbit
2
Untuk SQL Server, ini dilakukan secara otomatis (asalkan database dapat mendeteksi kebuntuan ). Mungkin kesulitan mendeteksinya jika, misalnya, itu sebenarnya adalah kunci hidup .
Richard
Luar biasa dan sangat teliti menjawab Richard. Satu titik tambahan pada kunci hidup (yang seharusnya tidak benar-benar dibandingkan atau terkait dengan kebuntuan, hanya pemblokirannya yang biasa saja) ... SQL akan mencegah kunci lebih lanjut diambil di mana kunci eksklusif menunggu, IIRC setelah 4 kunci bersama yang tumpang tindih berturut-turut.
Mark Storey-Smith
5

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 di SQL Server

Edit - beberapa tambahan:

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

Aaron Bertrand
sumber