ジョブの状態をMySQLデータベースに格納しているアプリケーションがあります(最近DynamoDBから移行されました)。私は現在、後続のクエリで更新がすぐに表示されず、障害が発生するという問題が発生しています。これは流れ、完全にシーケンシャル、起こっていない並行処理されていますトランザクションがクエリを実行する前にMySQLでコミットされていることを保証するにはどうすればよいですか?
- オブジェクトDB内には、オブジェクトは、オブジェクトが検索され、期待されている状態Y
- を持つように更新された状態X
- を持っています持っている状態Yは
- 取得したオブジェクトは、状態X、タスクは、私が学んだこと、そこに見えるから
失敗しました更新トランザクションにserializable
に
設定の分離レベル:この問題を回避するために、2つのオプションがあることを。
select ... for update
を使用してクエリを更新し、行を更新からロックします。
私はオプションの重さを知るには十分ではありませんが、多分誰かがこれを整理する手助けをすることができます。
私はGoでgormを使用していますが、カスタムSQLなどはありません。パフォーマンスは実際問題ではなく、データセットは小さく、更新は比較的まれです。状態フィールドは頻繁に照会されるので、索引付けされます。
のMySQLのInnoDBエンジンは、MVCCで動作します:あなたは別のトランザクションで作業しているので
MySQLクエリキャッシュ? – Havelock
更新プログラムはサイレントモードで失敗しますか?エラーを正しくチェックしていますか?これがトランザクション内にあるかどうかにかかわらず、あなたが何を記述するかは起こりません... – peufeu
更新は成功し、しばらくしてから表示されるので、これを理解するまでは醜いハックが100ms待つだけです。更新と選択は別の呼び出しで行われるため、別々のトランザクションになります。 – olovp