DBMS - Kontrol Koncurrency: Panduan untuk Pemula

Halo teman-teman, para ahli basis data masa depan! Hari ini, kita akan memulai sebuah perjalanan menarik ke dunia Kontrol Koncurrency dalam Sistem Manajemen Basis Data (DBMS). Jangan khawatir jika Anda baru saja memulai; saya akan menjadi panduan ramah Anda, dan kita akan mengexploreasi topik ini langkah demi langkah. Jadi, ambil secangkir kopi, dan mari kita masuk ke dalamnya!

DBMS - Concurrency Control

Apa Itu Kontrol Koncurrency?

Sebelum kita masuk ke detilnya, mari kita memahami apa itu kontrol koncurrency. Bayangkan sebuah restoran yang sibuk di mana beberapawaiter mencoba untuk memesan dan melayani makanan secara bersamaan. Tanpa koordinasi yang proper, chaos akan terjadi! Demikian pula, dalam basis data, beberapa pengguna atau proses mungkin mencoba untuk mengakses dan memodifikasi data pada saat yang sama. Kontrol koncurrency adalah seperti kepala waiter yang memastikan bahwa semua berjalan mulus tanpa konflik.

Sekarang, mari kita eksplor teknik utama yang digunakan untuk kontrol koncurrency dalam DBMS.

Protokol Berbasis Kunci

Memahami Kunci

Kunci adalah seperti "Jangan ganggu" tanda di pintu kamar hotel. Ketika sebuah transaksi memerlukan akses data, ia menempatkan kunci di atasnya, memberitahu orang lain, "Hey, saya sedang bekerja di sini!"

Jenis Kunci

Jenis Kunci Deskripsi Kasus Penggunaan
Kunci Bersama (S) Memungkinkan beberapa transaksi untuk membaca data Membaca data tanpa modifikasi
Kunci Eksklusif (X) Hanya satu transaksi saja yang dapat memegang kunci ini Menulis atau memperbarui data

Protokol Dua Fase Kunci (2PL)

Protokol ini adalah seperti tari dengan dua gerakan utama:

  1. Fase Tumbuh: Dapatkan kunci, jangan lepaskan yang lain.
  2. Fase Menyusut: Lepaskan kunci, jangan dapatkan yang lain.

mari kita lihat contoh sederhana:

BEGIN TRANSACTION;
-- Fase Tumbuh
LOCK TABLE users IN EXCLUSIVE MODE;
UPDATE users SET balance = balance - 100 WHERE id = 1;
LOCK TABLE transactions IN EXCLUSIVE MODE;
INSERT INTO transactions (user_id, amount) VALUES (1, -100);
-- Fase Menyusut
UNLOCK TABLE users;
UNLOCK TABLE transactions;
COMMIT;

Dalam contoh ini, kita pertama-tama mengunci tabel yang diperlukan, melakukan operasi kita, dan kemudian melepaskan kunci sebelum melakukan commit transaksi.

Deadlock: Tari yang Salah

Bayangkan dua penari menunggu satu sama lain membuat gerakan. Itu adalah deadlock! Dalam basis data, hal ini terjadi ketika dua transaksi menunggu satu sama lain untuk melepaskan kunci.

Untuk mencegah deadlock, kita menggunakan teknik seperti:

  1. Timeout: Jika sebuah transaksi menunggu terlalu lama, ia akan dibatalkan.
  2. Deteksi deadlock: Sistem secara aktif mencari deadlock dan menyelesaikan mereka.

Protokol Berbasis Timestamp

Sekarang, mari kita pindah gear dan bicara tentang protokol berbasis timestamp. Ini seperti memberikan setiap transaksi sebuah tiket unik dengan timestamp saat itu memasuki sistem.

Protokol Pemesanan Timestamp Dasar (TO)

Dalam protokol ini, kita menggunakan timestamp untuk menentukan urutan operasi yang konflik. Itu seperti melayani pelanggan berdasarkan waktu mereka tiba di restoran.

Berikut cara kerjanya:

  1. Setiap item data X memiliki dua nilai timestamp:
  • W-timestamp(X): Timestamp terbesar dari setiap transaksi yang berhasil menulis X.
  • R-timestamp(X): Timestamp terbesar dari setiap transaksi yang berhasil membaca X.
  1. Untuk transaksi T yang mencoba membaca X:
  • Jika TS(T) < W-timestamp(X), T terlalu lambat dan harus dibatalkan dan dimulai ulang.
  • Jika tidak, izinkan T membaca X dan set R-timestamp(X) ke max(R-timestamp(X), TS(T)).
  1. Untuk transaksi T yang mencoba menulis X:
  • Jika TS(T) < R-timestamp(X) atau TS(T) < W-timestamp(X), T terlalu lambat dan harus dibatalkan dan dimulai ulang.
  • Jika tidak, izinkan T menulis X dan set W-timestamp(X) ke TS(T).

mari kita lihat contoh:

class DataItem:
def __init__(self):
self.value = None
self.r_timestamp = 0
self.w_timestamp = 0

def read(transaction, data_item):
if transaction.timestamp < data_item.w_timestamp:
print(f"Transaksi {transaction.id} terlalu lambat untuk membaca. Membatalkan...")
abort(transaction)
else:
print(f"Transaksi {transaction.id} membaca nilai: {data_item.value}")
data_item.r_timestamp = max(data_item.r_timestamp, transaction.timestamp)

def write(transaction, data_item, new_value):
if (transaction.timestamp < data_item.r_timestamp or
transaction.timestamp < data_item.w_timestamp):
print(f"Transaksi {transaction.id} terlalu lambat untuk menulis. Membatalkan...")
abort(transaction)
else:
print(f"Transaksi {transaction.id} menulis nilai: {new_value}")
data_item.value = new_value
data_item.w_timestamp = transaction.timestamp

def abort(transaction):
print(f"Transaksi {transaction.id} dibatalkan dan akan dimulai ulang.")

Dalam contoh ini, kita telah implementasi operasi baca dan tulis dasar mengikuti protokol pemesanan timestamp. Sistem memeriksa timestamp sebelum mengizinkan operasi dan memperbarui mereka sesuai kebutuhan.

Rule Thomas Write: Optimisasi Cerdas

Rule Thomas Write adalah seperti membiarkan pelari yang lebih cepat melewati pelari yang lebih lambat dalam lomba. Itu memungkinkan kita untuk mengabaikan beberapa tulisan "terlalu lambat" tanpa membatalkan transaksi.

Berikut cara kerjanya:

Jika TS(T) < W-timestamp(X), instead of aborting T, kita hanya mengabaikan operasi tulis ini. Ini aman karena nilai yang ditulis sudah kedaluwarsa.

mari kita modifikasi fungsi tulis untuk mencakup Rule Thomas Write:

def write_with_thomas_rule(transaction, data_item, new_value):
if transaction.timestamp < data_item.r_timestamp:
print(f"Transaksi {transaction.id} terlalu lambat untuk menulis. Membatalkan...")
abort(transaction)
elif transaction.timestamp < data_item.w_timestamp:
print(f"Tulisan transaksi {transaction.id} diabaikan karena Rule Thomas.")
else:
print(f"Transaksi {transaction.id} menulis nilai: {new_value}")
data_item.value = new_value
data_item.w_timestamp = transaction.timestamp

Optimisasi ini membantu mengurangi jumlah transaksi pembatalan yang tidak diperlukan, meningkatkan kinerja sistem secara keseluruhan.

Penutup

Uff! Kita telah meliputi banyak hal hari ini, dari protokol berbasis kunci hingga protokol berbasis timestamp. Ingat, kontrol koncurrency adalah tentang memelihara ketertiban dalam dunia kerumunan operasi basis data secara bersamaan. Itu seperti menjadi petugas lalu lintas di persimpangan yang sibuk, memastikan bahwa semua orang bisa mencapai tujuannya tanpa benturan.

Sebagai Anda terus melanjutkan perjalanan Anda dalam dunia basis data, Anda akan menemui konsep dan teknik yang lebih lanjut. Tetapi untuk saat ini, pukul punggung Anda sendiri karena telah menguasai konsep dasar kontrol koncurrency!

Terus berlatih, tetap kurang curiga, dan selamat berkoding!

Credits: Image by storyset