残念ながら、MyISAMテーブルでレガシーmysql_ *関数を使用するアプリケーションがあるため(bleagh ...)、トランザクションを使用できません。現在の残高を取得し、この残高に問題がないかどうかを確認するコードがあります。問題がない場合は、数量を差し引いて新しい残高を保存します。
問題は、最近、2つのクエリが同じ開始残高を取得し、数量を減算してから、新しい残高を記録する例を見たことです。両方とも同じ開始バランスを取得したため、両方のUPDATES後の終了バランスが間違っています。
100 - 10 = 90
100 - 15 = 85
いつあるべきか...
100 - 10 = 90
90 - 15 = 75
これらのリクエストは数分間隔で実行されたため、競合状態によるものではないと思います。私の最初は、MySQLキャッシュが、バランスをとる同一の初期クエリの結果を保存しているということです。ただし、関連するテーブルが変更されると、このタイプのキャッシュは削除されることを読みました。
ほとんどの場合、すべてを1つのクエリにまとめることで修正しますが、それでもこれを理解したいと思います。それは私を神秘的にします。テーブルが変更されたときにキャッシュが削除された場合、起こったことは起こってはならないはずです。誰かがこのようなことを聞いたことがありますか、またはなぜそれが起こったのかについて何か考えがありますか?