問題は、MySQLレベルのロックを使用して、チケットを複数の人に割り当てられないようにしようとしていることです。この方法では、チケットがユーザーによってロックされているかどうかを検出する方法はありません。
チケットテーブルに2つのロック関連フィールドを追加することでアプリケーションレベルのロックを実装します。ロックが適用されたときのタイムスタンプと、ロックを保持しているユーザーを示すユーザーIDフィールドです。ロック関連のフィールドは別のテーブルに保持される場合があります(たとえば、この目的でショッピングカートを使用できます)。
ユーザーがチケットを選択すると、条件付き更新ステートメントを使用してこれらのロックフィールドを更新しようとします。
update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null
...
の代わりの値 アプリケーションによって提供されます。 lock_time is null
チケットが別のユーザーによってすでに選択されている場合、後のユーザーがロックを上書きしないようにするための基準があります。 updateステートメントの後で、影響を受ける行の数を確認してください。 1の場合、現在のユーザーがロックを取得しました。 0の場合、他の誰かがチケットをロックしました。
別のテーブルにロックデータがある場合は、そのテーブルのチケットIDフィールドに一意の制限を設定し、挿入を使用してロックを取得します。挿入が成功すると、ロックが取得されます。失敗した場合は、別のユーザーがチケットをロックしています。
通常、ロックは数分間保持されます。その後、アプリケーションはロックを解除する必要があります(ロックフィールドをnullに設定するか、他のテーブルからロックレコードを削除します)。