DBMS - Kekeliruan: Memahami dan Mencegah Kekembangan Kekeliruan Basis Data

Hai, para penggemar basis data yang ambisius! Saya senang memandu Anda melalui dunia menarik manajemen basis data (DBMS) dan salah satu konsep yang paling sulit: kekeliruan. Jangan khawatir jika Anda baru dalam pemrograman; kita akan mulai dari dasar dan naik turun. Pada akhir panduan ini, Anda akan menjadi detektif kekeliruan, mampu mengenali dan mencegah kekeliruan kecil ini yang menyebabkan kuncangan basis data!

DBMS - Deadlock

Apa Itu Kekeliruan?

Bayangkan Anda dan teman Anda duduk di meja dengan hanya satu garpu dan satu pisau. Anda memerlukan kedua alat makan ini untuk makan, tetapi Anda masing-masing memegang satu dan menolak melepaskan sampai Anda mendapat yang lain. Itu adalah esensi kekeliruan dalam dunia basis data!

Dalam istilah DBMS, kekeliruan terjadi ketika 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 contoh ini, jika Transaksi 1 memperbarui Account 1 dan Transaksi 2 memperbarui Account 2 secara bersamaan, mereka mungkin akan menunggu satu sama lain secara tak terbatas, menciptakan kekeliruan.

Pencegahan Kekeliruan

Sekarang kita mengerti apa itu kekeliruan, mari kita jelajahi bagaimana mencegahnya. Pencegahan kekeliruan melibatkan pengaturan sistem sedemikian rupa sehingga menghilangkan kemungkinan terjadinya kekeliruan.

1. Penyusunan Sumber Daya

Salah satu metode yang efektif adalah selalu meminta sumber daya dalam urutan khusus. Itu seperti mengatakan kepada para pemakan 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 cara kita dapat menulis contoh sebelumnya untuk mencegah kekeliruan:

-- 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 Account 1 sebelum Account 2, kita memastikan bahwa transaksi tidak akan kekeliruan.

2. Timeout Kunci

Metode pencegahan lain adalah menggunakan timeout kunci. Itu seperti mengatakan kepada para pemakan, "Jika Anda tidak bisa mendapatkan kedua alat makan dalam 5 menit, hanya tinggalkan dan coba lagi nanti."

Dalam SQL Server, Anda dapat mengatur timeout kunci seperti ini:

SET LOCK_TIMEOUT 5000; -- Set timeout ke 5 detik

Dengan cara ini, jika transaksi tidak bisa memperoleh kunci dalam 5 detik, itu akan secara otomatis mengembalikan, mencegah kekeliruan potensial.

3. Mengurangi Durasi Kunci

Semakin sedikit waktu sumber daya dikunci, semakin kecil kemungkinan terjadinya kekeliruan. Itu seperti mengatakan kepada para pemakan untuk makan lebih cepat! Dalam istilah basis data, ini berarti menjaga transaksi sebanyak mungkin.

Berikut contoh bagaimana mengurangi durasi kunci:

-- Sebaliknya ini:
BEGIN TRANSACTION;
-- Lakukan beberapa pengolahan yang panjang
UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;
COMMIT;

-- Lakukan beberapa pengolahan yang panjang
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;
COMMIT;

Dengan menggerakkan pengolahan yang panjang di luar transaksi, kita mengurangi waktu kunci yang dipegang.

Pemencegahan Kekeliruan

Sementara pencegahan bertujuan untuk membuat kekeliruan mustahil, pemencegahan adalah tentang membuat keputusan cerdas saat menjalankan untuk menghindari kekeliruan potensial.

1. Skema Menunggu-Mati

Dalam skema ini, transaksi yang lebih tua mendapat prioritas. Jika transaksi yang lebih muda meminta sumber daya yang dipegang oleh yang tua, itu "mati" (mengembalikan) dan mulai lagi. Jika transaksi yang tua meminta sumber daya yang dipegang oleh yang muda, itu menunggu.

Berikut 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 Luka-Menunggu

Ini adalah kebalikan dari Wait-Die. Transaksi yang lebih tua "luka" (mengembalikan) transaksi yang lebih muda, dan transaksi yang lebih 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 Bankir

Algoritma cerdik ini, dinamai setelah praktik pinjaman bank, menentukan apakah memenuhi permintaan sumber daya akan mengarah ke kekeliruan. Jika itu mungkin, permintaan ditolak.

Berikut versi sederhana Algoritma Bankir:

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  # Terima permintaan
else:
# Kembalikan perubahan dan tolak permintaan
available += request
allocation[process_id] -= request
return False

Algoritma ini memeriksa apakah memenuhi permintaan akan meninggalkan sistem dalam keadaan aman (di mana semua proses dapat selesai). Jika tidak, itu menolak permintaan.

Kesimpulan

Selamat! Anda baru saja mengambil langkah pertama ke dunia pencegahan dan pemencegahan kekeliruan. Ingat, mengatasi kekeliruan adalah seperti menjadi petugas lalu lintas di persimpangan yang sibuk. Kadang-kadang Anda perlu mencegah masalah sebelum mereka terjadi (seperti mengatur lampu lalu lintas), dan kadang-kadang Anda perlu membuat keputusan cepat untuk menghindari kecelakaan (seperti mengarahkan lalu lintas secara manual).

Sebagai Anda terus mengembangkan perjalanan Anda dalam manajemen basis data, Anda akan menemui lebih banyak kasus yang kompleks, tetapi prinsip yang kita diskusikan di sini akan menjadi dasar yang kuat. Terus latih, tetap bersemangat, dan jangan takut untuk mencoba. Setelah semuanya, setiap administrator basis data yang hebat dimulai dari tempat Anda sekarang!

Selamat coding, dan semoga transaksi Anda selalu bebas kekeliruan!

Credits: Image by storyset