Saat menangani konflik, Anda memiliki dua opsi:
- Anda dapat mencoba menghindari konflik, dan itulah yang dilakukan Penguncian Pesimis.
- Atau, Anda dapat membiarkan konflik terjadi, tetapi Anda perlu mendeteksinya saat melakukan transaksi Anda, dan itulah yang dilakukan Penguncian Optimis.
Sekarang, mari kita pertimbangkan anomali Pembaruan Hilang berikut :
Anomali Pembaruan yang Hilang dapat terjadi di tingkat isolasi Komitmen Baca .
Dalam diagram di atas kita dapat melihat bahwa Alice yakin dia dapat menarik 40 darinya account
tetapi tidak menyadari bahwa Bob baru saja mengubah saldo akun, dan sekarang hanya ada 20 yang tersisa di akun ini.
Mengunci Pesimistis
Penguncian pesimistis mencapai sasaran ini dengan mengambil kunci yang dibagikan atau dibaca di akun sehingga Bob tidak dapat mengubah akun.
Dalam diagram di atas, baik Alice dan Bob akan mendapatkan kunci baca di account
baris tabel yang telah dibaca oleh kedua pengguna. Database memperoleh kunci ini pada SQL Server saat menggunakan Baca berulang atau Serializable.
Karena baik Alice dan Bob telah membaca account
dengan nilai PK 1
, tidak satu pun dari mereka dapat mengubahnya sampai satu pengguna melepaskan kunci baca. Ini karena operasi penulisan memerlukan akuisisi kunci tulis / eksklusif, dan kunci bersama / baca mencegah kunci tulis / eksklusif.
Hanya setelah Alice melakukan transaksi dan kunci baca dirilis di account
baris, Bob UPDATE
akan melanjutkan dan menerapkan perubahan. Sampai Alice melepaskan kunci baca, UPDATE Bob memblokir.
Untuk detail lebih lanjut tentang bagaimana kerangka kerja akses data menggunakan dukungan penguncian pesimistis database yang mendasarinya, lihat artikel ini .
Penguncian Optimis
Penguncian yang Optimis memungkinkan terjadinya konflik tetapi mendeteksinya setelah menerapkan UPDATE Alice karena versinya telah berubah.
Kali ini, kami memiliki version
kolom tambahan . The version
kolom bertambah setiap kali UPDATE atau DELETE dijalankan, dan juga digunakan dalam klausa WHERE dari UPDATE dan pernyataan DELETE. Agar ini berfungsi, kita perlu mengeluarkan SELECT dan membaca saat ini version
sebelum menjalankan UPDATE atau DELETE, karena jika tidak, kita tidak akan tahu nilai versi apa yang diteruskan ke klausa WHERE atau kenaikan.
Untuk detail lebih lanjut tentang bagaimana kerangka kerja akses data menerapkan penguncian optimis, lihat artikel ini .
Transaksi tingkat aplikasi
Sistem basis data relasional telah muncul di akhir tahun 80-an awal 80-an ketika seorang klien, biasanya, terhubung ke mainframe melalui terminal. Itu sebabnya kami masih melihat sistem basis data mendefinisikan istilah seperti pengaturan SESI.
Saat ini, melalui Internet, kami tidak lagi menjalankan membaca dan menulis dalam konteks transaksi basis data yang sama, dan ACID tidak lagi memadai.
Misalnya, pertimbangkan use case berikut:
Tanpa penguncian yang optimis, Lost Update ini tidak mungkin tertangkap bahkan jika transaksi basis data yang digunakan Serializable. Ini karena membaca dan menulis dieksekusi dalam permintaan HTTP yang terpisah, karenanya pada transaksi basis data yang berbeda.
Jadi, penguncian yang optimis dapat membantu Anda mencegah Pembaruan yang Hilang bahkan ketika menggunakan transaksi tingkat aplikasi yang juga memasukkan waktu berpikir pengguna.
Untuk detail lebih lanjut tentang tingkat aplikasi atau transaksi logis, lihat artikel ini .
Kesimpulan
Penguncian optimis adalah teknik yang sangat berguna, dan berfungsi dengan baik bahkan ketika menggunakan tingkat isolasi yang kurang ketat, seperti Read Committed, atau ketika membaca dan menulis dieksekusi dalam transaksi basis data berikutnya.
Kelemahan dari penguncian optimis adalah bahwa kemunduran akan dipicu oleh kerangka kerja akses data setelah menangkap OptimisticLockException
, karena itu kehilangan semua pekerjaan yang telah kami lakukan sebelumnya oleh transaksi yang sedang berjalan.
Semakin banyak pertikaian, semakin banyak konflik, dan semakin besar peluang untuk membatalkan transaksi. Kembalikan dapat mahal untuk sistem database karena perlu mengembalikan semua perubahan yang tertunda saat ini yang mungkin melibatkan baris tabel dan catatan indeks.
Karena alasan ini, penguncian pesimistis mungkin cocok untuk saat konflik sering terjadi, karena hal ini mengurangi peluang untuk memutar kembali transaksi.