Masalahnya adalah Anda mencoba menggunakan penguncian level MySQL untuk memastikan bahwa tiket tidak dapat diberikan ke lebih dari satu orang. Dengan cara ini tidak ada cara untuk mendeteksi jika tiket dikunci oleh pengguna.
Saya akan menerapkan kunci level aplikasi dengan menambahkan 2 bidang terkait kunci ke tabel tiket:stempel waktu ketika kunci diterapkan dan bidang id pengguna yang memberi tahu Anda pengguna mana yang memegang kunci. Bidang terkait kunci dapat disimpan di tabel lain (keranjang belanja, misalnya dapat digunakan untuk tujuan ini).
Saat pengguna memilih tiket, Anda mencoba memperbarui bidang kunci ini dengan pernyataan pembaruan bersyarat:
update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null
Nilai sebagai pengganti ...
disediakan oleh aplikasi Anda. lock_time is null
ada kriteria untuk memastikan bahwa jika tiket telah dipilih oleh pengguna lain, maka pengguna berikutnya tidak mengesampingkan kunci. Setelah pernyataan pembaruan, periksa jumlah baris yang terpengaruh. Jika satu, maka pengguna saat ini memperoleh kunci. Jika 0, maka orang lain mengunci tiketnya.
Jika Anda memiliki data penguncian di tabel lain, maka tempatkan batasan unik pada bidang id tiket di tabel itu dan gunakan sisipkan untuk mendapatkan kunci. Jika penyisipan berhasil, maka kunci diperoleh. Jika gagal, berarti tiket telah dikunci oleh pengguna lain.
Kunci biasanya ditahan selama beberapa menit, setelah itu aplikasi Anda harus melepaskan kunci (setel bidang penguncian ke nol atau hapus rekaman penguncian dari tabel lain).