私はテーブルを持っていますtbl_orders
。数量フィールドがありますquantity
。アプリケーションの一部で、数量を1つ減らす必要があります。
レコードの(クライアント側から入手可能)をすでに知っているid
ので、更新ステートメントを発行します。
UPDATE tbl_orders
SET quantity=quantity-1
WHERE id= 6
問題は、このクエリが誤って複数回同時に実行される可能性があることです。たとえば、2人のカスタマーサービスオペレーターが同じレコードを同時に更新する場合があります。つまり、数量が1回だけデクリメントされることになっている場合、数量は2だけデクリメントされます。
更新をトランザクションに入れようとしましたが、最初のトランザクションがコミットされるまで2番目のトランザクションを遅らせるだけでした。コミットされると、2番目の更新が実行され、レコードが再びデクリメントされました。
レコードを変更している場合、他のクエリが失敗することを確認するにはどうすればよいですか?
アップデート:
更新が有効であるためには、クライアント側の数量はデータベース内で同じでした。たとえば、ユーザーがブラウザで数量5を確認し、それをデクリメントしたい場合、データベースの値は同じである必要があります。
更新2
Doctrine 2を使用した楽観的ロックについて、ここで適切な説明を見つけました。