2017-06-19 20 views
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から

+0

をロックされ、この平均値は、**の行を読んで**から他のクエリを防ぐことはできません。それらの行が更新されないようにします。行をロックする代わりに、クエリ内のwhere句を使用して読み取られないようにステータスを変更することもできます。たとえば、更新を行い、ステータスを「保留中」に設定するか、GUIDを設定して、後でプロセスの特定の行を選択/更新できるようにします。 –

+0

それは理にかなっています!したがって、次のようになります。 チケットはステータス= '保留中'、my_unique_id = 'ABCD'はステータス= '利用可能'です。 と私は後でmy_unique_id経由で選択できますか?私は限界によって定義されたすべてのレコードを正常に更新できなかった場合、私はロールバックすることができます。私はこれを試してみる、ありがとう! –

答えて

0

で読み取ることができないように行をロックしようとしているhttps://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html指標については

は、同じ、検索遭遇を記録し、行と任意の 関連するインデックスエントリをロックこれらの行に対してUPDATE 文を発行したかのようになります。

あなたは、クエリの行レベルでこの作品を見るように行をロックするだけで2結果の行

関連する問題