テーブルをロックしたり、トランザクションでロックしたりすることを忘れました。これには、より良いパターンがあります:
- 一意のトークンを生成する
- そのトークンを次に利用可能なレコードに割り当てます
- トークンを取得した行を読み取り、処理します
そうすれば、ロックやトランザクションはまったく必要ありません(DBはトークンを1つの未使用のレコードにのみ割り当てるため)。
擬似コード:
$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);