Kontrol concurrency berbasis kunci
Menggunakan penguncian untuk mengontrol akses ke sumber daya bersama rentan terhadap kebuntuan, dan penjadwal transaksi sendiri tidak dapat mencegah kejadiannya.
Misalnya, sistem basis data relasional menggunakan berbagai kunci untuk menjamin properti ACID transaksi .
Apa pun sistem basis data relasional yang Anda gunakan, kunci akan selalu diperoleh saat memodifikasi (misalnya, UPDATE
atau DELETE
) catatan tabel tertentu. Tanpa mengunci baris yang dimodifikasi oleh transaksi yang sedang berjalan, Atomicity akan dikompromikan .
Apa itu jalan buntu
Seperti yang saya jelaskan dalam artikel ini , kebuntuan terjadi ketika dua transaksi bersamaan tidak dapat membuat kemajuan karena masing-masing menunggu yang lain untuk melepaskan kunci, seperti yang diilustrasikan dalam diagram berikut.
Karena kedua transaksi berada dalam fase akuisisi kunci, tidak ada yang melepaskan kunci sebelum memperoleh yang berikutnya.
Sembuh dari situasi jalan buntu
Jika Anda menggunakan algoritma Kontrol Konkurensi yang bergantung pada kunci, maka selalu ada risiko berjalan dalam situasi jalan buntu. Kebuntuan dapat terjadi di lingkungan konkurensi apa pun, tidak hanya dalam sistem basis data.
Misalnya, program multithreading dapat menemui jalan buntu jika dua atau lebih utas menunggu pada kunci yang sebelumnya diperoleh sehingga tidak ada utas yang dapat membuat kemajuan. Jika ini terjadi pada aplikasi Java, JVM tidak bisa memaksa Thread untuk menghentikan eksekusi dan melepaskan kunci-kuncinya.
Bahkan jika Thread
kelas mengekspos suatu stop
metode, metode itu sudah tidak digunakan lagi sejak Java 1.1 karena dapat menyebabkan objek dibiarkan dalam keadaan tidak konsisten setelah thread dihentikan. Sebaliknya, Java mendefinisikan interrupt
metode, yang bertindak sebagai petunjuk sebagai utas yang terputus dapat dengan mudah mengabaikan gangguan dan melanjutkan eksekusi.
Untuk alasan ini, aplikasi Java tidak dapat pulih dari situasi deadlock, dan merupakan tanggung jawab pengembang aplikasi untuk memesan permintaan akuisisi kunci sedemikian rupa sehingga deadlock tidak pernah terjadi.
Namun, sistem basis data tidak dapat memberlakukan perintah akuisisi kunci yang diberikan karena tidak mungkin untuk meramalkan kunci lain yang ingin diperoleh transaksi tertentu. Mempertahankan urutan kunci menjadi tanggung jawab lapisan akses data, dan database hanya dapat membantu memulihkan dari situasi deadlock.
Mesin basis data menjalankan proses terpisah yang memindai grafik konflik saat ini untuk siklus kunci-tunggu (yang disebabkan oleh deadlock). Ketika sebuah siklus terdeteksi, mesin basis data mengambil satu transaksi dan membatalkannya, menyebabkan kunci-nya dilepaskan, sehingga transaksi lainnya dapat membuat kemajuan.
Berbeda dengan JVM, transaksi basis data dirancang sebagai unit kerja atom. Oleh karena itu, rollback membuat database dalam keadaan konsisten.
Untuk detail lebih lanjut tentang topik ini, lihat artikel ini juga.