残念ながらMyISAMテーブル(bleagh ...)でレガシーmysql_ *関数を使用するアプリケーションがあるので、トランザクションは使用できません。現在の残高を取得するコードがあり、この残高が大丈夫かどうかを確認します。はいの場合は、残量を減算して新しい残高を保存します。古い値を返すMySQL SELECT
問題は、私は最近、2つのクエリが同じ開始残高を取得し、数量を減算してから、新しい残高を記録するインスタンスを見てきました。両方とも同じ開始残高を獲得したので、両方の更新後の終了残高は間違っています。
100 - 10 = 90
100 - 15 = 85
それがあるべき は...
100 - 10 = 90
90 - 15 = 75
は、これらの要求は離れて数分を実行するので、私は不一致が競合状態が原因であるとは考えていません。私の最初は、MySQLキャッシュは、バランスを取る同じ初期クエリの結果を格納しているということです。しかし、関連するテーブルが変更された場合、このタイプのキャッシュは削除されます。
すべてを1つのクエリに入れて修正する可能性がありますが、これを把握したいと考えています。それは私を神秘的にする。テーブルが変更されたときにキャッシュが削除された場合、起こったことは起こってはいけません。誰かがこのようなことを聞いたことがありますか、それが起こったかもしれない理由についてのアイデアがありますか?
この現象を再現するコードの簡略化されたバージョンを投稿できますか? –
mysql_ *でトランザクションを使用することはできませんか? innoDBテーブルを使用している場合は、mysql_query( "START TRANSACTION")などを実行するだけです。 – bfavaretto
@bfavaretto残念ながら、彼らはMyISAMです。 – dqhendricks