2

私はテーブルを持っていますtbl_orders。数量フィールドがありますquantity。アプリケーションの一部で、数量を1つ減らす必要があります。

レコードの(クライアント側から入手可能)をすでに知っているidので、更新ステートメントを発行します。

UPDATE tbl_orders
SET quantity=quantity-1
WHERE id= 6 

問題は、このクエリが誤って複数回同時に実行される可能性があることです。たとえば、2人のカスタマーサービスオペレーターが同じレコードを同時に更新する場合があります。つまり、数量が1回だけデクリメントされることになっている場合、数量は2だけデクリメントされます。

更新をトランザクションに入れようとしましたが、最初のトランザクションがコミットされるまで2番目のトランザクションを遅らせるだけでした。コミットされると、2番目の更新が実行され、レコードが再びデクリメントされました。

レコードを変更している場合、他のクエリが失敗することを確認するにはどうすればよいですか?

アップデート:

更新が有効であるためには、クライアント側の数量はデータベース内で同じでした。たとえば、ユーザーがブラウザで数量5を確認し、それをデクリメントしたい場合、データベースの値は同じである必要があります。

更新2

Doctrine 2を使用した楽観的ロックについて、ここで適切な説明を見つけました。

4

1 に答える 1

7

私が過去に使用/見たアプローチの1つは、タイムスタンプ列を使用することでした。クエリを実行するときは、レコードの編集を開始するときにIDと元のタイムスタンプの両方があることを確認してください。次に、更新しようとしているときに、

update YourTable
   set counter = counter -1,
       TheTimestampColumn = new timestamp value
   where ID = yourID
     and TheTimeStampColumn = timeStampEditStartedWith

このように、元の開始タイムスタンプで最初にそれに到達した人が勝ちます。次の例では、更新されたレコードの数を追跡する必要があり、そのカウントがゼロに等しい場合は、閲覧中に他の人がレコードに変更を加えたことをユーザーに通知します。最新のデータをリロードしますか?(またはそのようなもの)。

于 2012-11-29T21:57:13.670 に答える