DBMS - Pengawalan Keganasan: Panduan Pemula
Hai sana, para ahli pangkalan data masa depan! Hari ini, kita akan memulakan sebuah perjalanan yang menarik ke dalam dunia Pengawalan Keganasan dalam Sistem Pengurusan Pangkalan Data (DBMS). Jangan khawatir jika anda baru kepada ini; saya akan menjadi pemandu yang ramah, dan kita akan mengenalpasti topik ini secara berperingkat. Jadi, ambil secawan kopi, dan mari kita masuk ke dalamnya!
Apa Itu Pengawalan Keganasan?
Sebelum kita masuk ke dalam hal yang halus, mari kita memahami apa sebenarnya pengawalan keganasan. Bayangkan sebuah restoran yang sibuk di mana beberapa penjaga meja cuba untuk mengambil order dan melayan makanan secara bersimultan. Tanpa koordinasi yang proper, kekacauan akan terjadi! Demikian juga, dalam pangkalan data, beberapa pengguna atau proses mungkin cuba untuk mengakses dan mengubah data pada masa yang sama. Pengawalan keganasan adalah seperti pemimpin penjaga meja yang memastikan segalanya berjalan lancar tanpa konflik.
Sekarang, mari kita eksplor teknik utama yang digunakan untuk pengawalan keganasan dalam DBMS.
Protokol Berdasarkan Kunci
Memahami Kunci
Kunci adalah seperti "Jangan Ganggu" tanda di pintu bilik hotel. Ketika sebuah transaksi perlu mengakses data, ia meletakkan kunci di atasnya, memberitahu orang lain, "Hey, saya sedang bekerja di sini!"
Jenis Kunci
Jenis Kunci | Keterangan | Kesemuaan |
---|---|---|
Kunci Bersama (S) | Membolehkan beberapa transaksi untuk membaca data | Membaca data tanpa modifikasi |
Kunci Eksklusif (X) | Hanya satu transaksi boleh memegang kunci ini | Menulis atau memperbaharui data |
Protokol Dua Fasa Kunci (2PL)
Protokol ini adalah seperti tari dengan dua gerakan utama:
- Fasa Tumbuh: Dapatkan kunci, jangan lepaskan mana-mana.
- Fasa Kecil: Lepaskan kunci, jangan dapatkan mana-mana.
Mari kita lihat contoh yang mudah:
BEGIN TRANSACTION;
-- Fasa 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);
-- Fasa Kecil
UNLOCK TABLE users;
UNLOCK TABLE transactions;
COMMIT;
Dalam contoh ini, kita pertama-tama mengunci meja yang diperlukan, melakukan operasi kita, dan kemudian melepaskan kunci sebelum melakukan commit transaksi.
Kegagalan: Tari yang Salah
Bayangkan dua penari menunggu satu sama lain membuat gerakan. Itu adalah kematian! Dalam pangkalan data, hal ini terjadi ketika dua transaksi menunggu satu sama lain untuk melepaskan kunci.
Untuk mencegah kematian, kita menggunakan teknik seperti:
- Timeout: Jika sebuah transaksi menunggu terlalu lama, ia dibatalkan.
- Deteksi Kematian: Sistem secara aktif mencari kematian dan menyelesaikannya.
Protokol Berdasarkan Waktu Stempel
Sekarang, mari kita beralih gear dan bicarakan tentang protokol berdasarkan waktu stempel. Ini adalah seperti memberikan setiap transaksi sebuah tiket unik dengan waktu stempel ketika ia memasuki sistem.
Protokol Penyusunan Waktu Stempel Asas (TO)
Dalam protokol ini, kita menggunakan waktu stempel untuk menentukan urutan operasi konflik. Itu seperti melayani pelanggan berdasarkan waktu mereka tiba di restoran.
Berikut cara ia bekerja:
- Setiap item data X mempunyai dua nilai waktu stempel:
- W-timestamp(X): Waktu stempel terbesar bagi mana-mana transaksi yang berjaya menulis X.
- R-timestamp(X): Waktu stempel terbesar bagi mana-mana transaksi yang berjaya membaca X.
- Bagi transaksi T cuba membaca X:
- Jika TS(T) < W-timestamp(X), T terlalu lewat dan mesti dibatalkan dan dimulakan semula.
- Sebaliknya, izinkan T membaca X dan set R-timestamp(X) kepada max(R-timestamp(X), TS(T)).
- Bagi transaksi T cuba menulis X:
- Jika TS(T) < R-timestamp(X) atau TS(T) < W-timestamp(X), T terlalu lewat dan mesti dibatalkan dan dimulakan semula.
- Sebaliknya, izinkan T menulis X dan set W-timestamp(X) kepada 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 lewat untuk membaca. Dibatalkan...")
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 lewat untuk menulis. Dibatalkan...")
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 dimulakan semula.")
Dalam contoh ini, kita telah implementasi operasi baca dan tulis asas mengikut protokol penyusunan waktu stempel. Sistem memeriksa waktu stempel sebelum membolehkan operasi dan mengemaskini mereka sewajarnya.
Peraturan Menulis Thomas: Optimisasi Bijak
Peraturan Menulis Thomas adalah seperti membolehkan penjalan yang lebih cepat melepasi penjalan yang lambat dalam larian. Ia membolehkan kita mengabaikan beberapa "terlalu lewat" tulisan tanpa membatalkan transaksi.
Berikut cara ia bekerja:
Jika TS(T) < W-timestamp(X), sebaliknya membatalkan T, kita simply ignore tulisan ini. Ini adalah selamat kerana nilai yang ditulis adalah kedaluwarsa sebarang.
Mari kita modify fungsi tulis untuk termasuk Peraturan Menulis Thomas:
def write_with_thomas_rule(transaction, data_item, new_value):
if transaction.timestamp < data_item.r_timestamp:
print(f"Transaksi {transaction.id} terlalu lewat untuk menulis. Dibatalkan...")
abort(transaction)
elif transaction.timestamp < data_item.w_timestamp:
print(f"Tulisan Transaksi {transaction.id} diabaikan kerana Peraturan Menulis 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 mengurangkan bilangan transaksi yang tidak perlu dibatalkan, meningkatkan prestasi sistem keseluruhan.
Penutup
Wah! Kita telah meliputi banyak hal hari ini, dari protokol berdasarkan kunci ke protokol berdasarkan waktu stempel. Ingat, pengawalan keganasan adalah tentang memelihara ketenteraman dalam dunia yang penuh keganasan operasi pangkalan data bersimultan. Ia seperti menjadi polis di persimpangan sibuk, memastikan semua orang mendapatkan ke mana mereka perlu tanpa menabrak satu sama lain.
Sebagai anda teruskan perjalanannya dalam dunia pangkalan data, anda akan bertemu dengan konsep dan teknik yang lebih maju. Tetapi untuk sekarang, rasa senang kerana telah menguasai konsep asas pengawalan keganasan!
Teruskan untuk berlatih, kekal curious, dan selamat berkoding!
Credits: Image by storyset