Bagaimana cara menerapkan penguncian optimis di MySQL dengan benar?
Tim kami telah menyimpulkan bahwa kami harus melakukan # 4 di bawah ini atau ada risiko bahwa utas lain dapat memperbarui versi catatan yang sama, tetapi kami ingin memvalidasi bahwa ini adalah cara terbaik untuk melakukannya.
- Buat bidang versi pada tabel yang ingin Anda gunakan penguncian optimis untuk misalnya kolom nama = "versi"
- Pada pilihan, pastikan untuk memasukkan kolom versi dan catat versi tersebut
- Pada pembaruan berikutnya ke catatan, pernyataan pembaruan harus mengeluarkan "di mana versi = X" di mana X adalah versi yang kami terima di # 2 dan mengatur bidang versi selama pernyataan pembaruan itu ke X + 1
- Lakukan
SELECT FOR UPDATE
pada catatan yang akan kami perbarui sehingga kami membuat serialisasi siapa yang dapat membuat perubahan pada catatan yang kami coba perbarui.
Untuk memperjelas, kami mencoba untuk mencegah dua utas yang memilih catatan yang sama di jendela waktu yang sama di mana mereka mengambil versi catatan yang sama dari saling menimpa satu sama lain jika mereka mencoba dan memperbarui catatan pada saat yang sama. Kami percaya bahwa kecuali kami # 4, ada kemungkinan, bahwa jika kedua utas memasukkan transaksi masing-masing pada saat yang sama (tetapi belum mengeluarkan pembaruan mereka), ketika mereka pergi untuk memperbarui, utas kedua yang akan menggunakan UPDATE ... di mana versi = X akan beroperasi pada data lama.
Apakah kita benar dalam berpikir bahwa kita harus melakukan penguncian pesimistis ini ketika memperbarui walaupun kita menggunakan bidang versi / penguncian optimis?
SELECT ... FOR UPDATE
atau penguncian optimis demi baris versioning, tidak keduanya. Lihat detail sebagai jawaban.