0
私はイベントへのすべてのチケットを含むチケットテーブルを持っています。すべてのチケットは予約時に「利用可能」の状態であらかじめ作成し、私は他の操作は、このトランザクションにアクセスできないように、テーブル内のN個のレコードを選択し、更新したいです:更新と制限の操作のためのselectを組み合わせて、
を使用して-- get any 2 tickets that are available:
SELECT *
from tickets
WHERE status = 'available'
LIMIT 2 FOR UPDATE;
--(...psuedo code: if 2 records were returned, set status to 'reserved' and update other tables ,
--otherwise rollback as all tickets could not be fulfilled)
更新のために、これは他のトランザクションが同じ2行を選択しないことを保証しますか?私は基本的に人々が同じチケットを予約できないようにしたい。そのため、私はそれが他のトランザクションのMySQLから
をロックされ、この平均値は、**の行を読んで**から他のクエリを防ぐことはできません。それらの行が更新されないようにします。行をロックする代わりに、クエリ内のwhere句を使用して読み取られないようにステータスを変更することもできます。たとえば、更新を行い、ステータスを「保留中」に設定するか、GUIDを設定して、後でプロセスの特定の行を選択/更新できるようにします。 –
それは理にかなっています!したがって、次のようになります。 チケットはステータス= '保留中'、my_unique_id = 'ABCD'はステータス= '利用可能'です。 と私は後でmy_unique_id経由で選択できますか?私は限界によって定義されたすべてのレコードを正常に更新できなかった場合、私はロールバックすることができます。私はこれを試してみる、ありがとう! –