Saya lupa mencoba mengunci tabel dan/atau melakukannya dalam transaksi, ada pola yang lebih baik untuk ini:
- Buat token unik
- Tetapkan token itu ke rekaman berikutnya yang tersedia
- Baca baris mana yang mendapatkan token, dan proses
Dengan begitu Anda tidak memerlukan penguncian dan transaksi sama sekali (karena DB akan menetapkan token Anda HANYA ke SATU catatan yang tidak digunakan).
Kode semu:
$token = time(); //Only you have very low concurrency. Otherwise use something more unique, like a GUID or an identity value from a tokens table.
EXEC SQL: "UPDATE mytable SET token = $token WHERE token IS NULL LIMIT 1"
EXEC SQL: "SELECT id FROM mytable WHERE token = $token"
process($id);