DBMS - Deadlock: Understanding and Preventing Database Bottlenecks
Hai, para penggemar basis data yang sedang berkembang! Saya sangat senang untuk membimbing Anda melalui dunia yang menarik dari sistem manajemen basis data (DBMS) dan salah satu konsep yang sulit: deadlock. Jangan khawatir jika Anda baru dalam pemrograman; kita akan mulai dari dasar dan maju perlahan-lahan. Pada akhir panduan ini, Anda akan menjadi detektif deadlock, mampu mengenali dan mencegah kendala basis data yang keselamaan ini!
Apa Itu Deadlock?
Bayangkan Anda dan teman Anda duduk di meja dengan hanya satu garpu dan satu pisau. Anda memerlukan kedua alat makan ini untuk makan, tapi Anda masing-masing memegang satu dan menolak melepaskan sampai Anda mendapat yang lain. Itu sebenarnya apa yang deadlock dalam dunia basis data!
Dalam istilah DBMS, deadlock terjadi saat dua atau lebih transaksi menunggu satu sama lain untuk melepaskan sumber daya yang mereka pegang. Itu seperti pertandingan menunggu digital, di mana tidak ada yang bisa maju.
mari lihat contoh sederhana:
-- Transaksi 1
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;
UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 2;
COMMIT;
-- Transaksi 2
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 50 WHERE AccountID = 2;
UPDATE Accounts SET Balance = Balance + 50 WHERE AccountID = 1;
COMMIT;
Dalam konteks ini, jika Transaksi 1 memperbarui Akun 1 dan Transaksi 2 memperbarui Akun 2 secara bersamaan, mereka mungkin akan menunggu satu sama lain secara tak terbatas, menciptakan deadlock.
Pencegahan Deadlock
Sekarang kita mengerti apa itu deadlock, mari kita eksplor bagaimana mencegahnya. Pencegahan deadlock melibatkan pengaturan sistem sedemikian rupa sehingga menghilangkan kemungkinan terjadinya deadlock.
1. Penyusunan Urutan Sumber Daya
Salah satu metode yang efektif adalah selalu meminta sumber daya dalam urutan tertentu. Itu seperti mengatakan kepada pengunjung restoran untuk selalu mengambil garpu terlebih dahulu, kemudian pisau. Dengan cara ini, mereka tidak akan berada dalam situasi di mana masing-masing memegang alat makan yang diperlukan oleh yang lain.
Berikut adalah bagaimana kita dapat menulis contoh sebelumnya untuk mencegah deadlock:
-- Transaksi 1
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;
UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 2;
COMMIT;
-- Transaksi 2
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 50 WHERE AccountID = 1;
UPDATE Accounts SET Balance = Balance + 50 WHERE AccountID = 2;
COMMIT;
Dengan selalu memperbarui Akun 1 sebelum Akun 2, kita memastikan bahwa transaksi tidak akan deadlock.
2. Batas Waktu Lock
Metode pencegahan lain adalah menggunakan batas waktu lock. Itu seperti mengatakan kepada pengunjung restoran, "Jika Anda tidak bisa mendapatkan kedua alat makan dalam 5 menit, abaikan saja dan coba lagi nanti."
Dalam SQL Server, Anda dapat menyetel batas waktu lock seperti ini:
SET LOCK_TIMEOUT 5000; -- Set timeout ke 5 detik
Dengan cara ini, jika transaksi tidak bisa mendapatkan lock dalam 5 detik, itu akan secara otomatis rollback, mencegah deadlock potensial.
3. Mengurangi Durasi Lock
Semakin sedikit waktu sumber daya terkunci, semakin kecil kemungkinan deadlock. Itu seperti mengatakan kepada pengunjung restoran untuk makan lebih cepat! Dalam istilah basis data, ini berarti menjaga transaksi sebanyak mungkin.
Berikut adalah contoh bagaimana mengurangi durasi lock:
-- Sebaliknya ini:
BEGIN TRANSACTION;
-- Lakukan beberapa proses panjang
UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;
COMMIT;
-- Lakukan ini:
-- Lakukan beberapa proses panjang
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;
COMMIT;
Dengan memindahkan proses panjang diluar transaksi, kita mengurangi waktu lock yang dipegang.
Pencegahan Deadlock
Sementara pencegahan bertujuan untuk membuat deadlock mustahil, pencegahan adalah tentang membuat keputusan cerdas saat runtime untuk menghindari deadlock potensial.
1. Skema Wait-Die
Dalam skema ini, transaksi yang lebih tua mendapat prioritas. Jika transaksi yang lebih muda meminta sumber daya yang dipegang oleh yang tua, itu "mati" (rollback) dan restart. Jika transaksi yang tua meminta sumber daya yang dipegang oleh yang muda, itu menunggu.
Berikut adalah representasi pseudocode:
def request_resource(transaction, resource):
if resource.is_held_by_younger_transaction(transaction):
wait(transaction, resource)
else:
die_and_restart(transaction)
2. Skema Wound-Wait
Ini adalah kebalikan dari Wait-Die. Transaksi yang tua "menggores" (rollback) yang muda, dan yang muda menunggu yang tua.
def request_resource(transaction, resource):
if resource.is_held_by_younger_transaction(transaction):
wound(resource.holder)
else:
wait(transaction, resource)
3. Algoritma Banker
Algoritma ini, dinamai setelah praktik pinjaman bank, menentukan apakah permintaan sumber daya dapat mengarah ke deadlock. Jika bisa, permintaan ditolak.
Berikut adalah versi sederhana Algoritma Banker:
def is_safe_state(available, max_need, allocation):
work = available.copy()
finish = [False] * len(allocation)
while True:
found = False
for i in range(len(allocation)):
if not finish[i] and (max_need[i] - allocation[i] <= work).all():
work += allocation[i]
finish[i] = True
found = True
if not found:
break
return all(finish)
def request_resources(process_id, request):
if request > max_need[process_id] - allocation[process_id]:
return False # Permintaan melebihi klaim maksimum
if request > available:
return False # Sumber daya tidak tersedia
# Secara temporal alokasi sumber daya
available -= request
allocation[process_id] += request
if is_safe_state(available, max_need, allocation):
return True # Grant permintaan
else:
# Kembalikan perubahan dan tolak permintaan
available += request
allocation[process_id] -= request
return False
Algoritma ini memeriksa apakah memberikan permintaan akan meninggalkan sistem dalam keadaan aman (di mana semua proses dapat selesai). Jika tidak, permintaan ditolak.
Kesimpulan
Selamat! Anda telah mengambil langkah pertama ke dunia pencegahan dan penghindaran deadlock. Ingat, mengatasi deadlock adalah seperti menjadi petugas lalu lintas di persimpangan yang sibuk. Kadang-kadang Anda perlu mencegah masalah sebelum terjadi (seperti menyiapkan lampu lalu lintas), dan kadang-kadang Anda perlu membuat keputusan cepat untuk menghindari kecelakaan (seperti mengarahkan lalu lintas secara manual).
Sebagai Anda terus melanjutkan perjalanan Anda dalam manajemen basis data, Anda akan menghadapi lebih banyak kasus yang kompleks, tapi prinsip yang kita diskusikan di sini akan menjadi dasar yang kuat. Terus berlatih, tetap bersemangat, dan jangan takut untuk mencoba. Setelah semuanya, setiap administrator basis data yang hebat dimulai tepat di tempat Anda sekarang!
Selamat coding, dan semoga transaksi Anda selalu bebas deadlock!
Credits: Image by storyset