Tôi đã quên cố gắng khóa bảng và / hoặc thực hiện nó trong một giao dịch, có một mẫu tốt hơn cho việc này:
- Tạo một mã thông báo duy nhất
- Gán mã thông báo đó cho bản ghi có sẵn tiếp theo
- Đọc hàng nào có mã thông báo và xử lý nó
Bằng cách đó, bạn hoàn toàn không cần khóa và giao dịch (bởi vì DB sẽ chỉ định mã thông báo của bạn CHỈ cho MỘT bản ghi không sử dụng).
Mã giả:
$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);