2017-11-23 5 views
0

ジョブの状態をMySQLデータベースに格納しているアプリケーションがあります(最近DynamoDBから移行されました)。私は現在、後続のクエリで更新がすぐに表示されず、障害が発生するという問題が発生しています。これは流れ、完全にシーケンシャル、起こっていない並行処理されていますトランザクションがクエリを実行する前にMySQLでコミットされていることを保証するにはどうすればよいですか?

  1. オブジェクトDB内には、オブジェクトは、オブジェクトが検索され、期待されている状態Y
  2. を持つように更新された状態X
  3. を持っています持っている状態Yは
  4. 取得したオブジェクトは、状態X、タスクは、私が学んだこと、そこに見えるから

失敗しました更新トランザクションにserializable

  1. 設定の分離レベル:この問題を回避するために、2つのオプションがあることを。

  2. select ... for updateを使用してクエリを更新し、行を更新からロックします。

私はオプションの重さを知るには十分ではありませんが、多分誰かがこれを整理する手助けをすることができます。

私はGoでgormを使用していますが、カスタムSQLなどはありません。パフォーマンスは実際問題ではなく、データセットは小さく、更新は比較的まれです。状態フィールドは頻繁に照会されるので、索引付けされます。

のMySQLのInnoDBエンジンは、MVCCで動作します:あなたは別のトランザクションで作業しているので

+1

MySQLクエリキャッシュ? – Havelock

+0

更新プログラムはサイレントモードで失敗しますか?エラーを正しくチェックしていますか?これがトランザクション内にあるかどうかにかかわらず、あなたが何を記述するかは起こりません... – peufeu

+0

更新は成功し、しばらくしてから表示されるので、これを理解するまでは醜いハックが100ms待つだけです。更新と選択は別の呼び出しで行われるため、別々のトランザクションになります。 – olovp

答えて

1

。これは、トランザクションを開始するとすぐに、データベースに対するビューは、完全なトランザクションの場合と同じままであることを意味します。並列実行トランザクションが完了してもダーティリードが実行されない場合でも、変更は以前に開始されたトランザクションでは認識されません。

これを念頭に置いておけば、奇妙な動作についての説明があり、これを回避するための決定的な行動をとることができます。

+0

私は、感謝します、ありがとう、参照してください。これに対処する方法はありますか? – olovp

+0

"REQUIRES_NEW"属性を持つBeanメソッドを呼び出す可能性がある、現在のトランザクション外の状態を調べる必要がある場合は役立ちます。完了したトランザクションに関する情報が返されます。それはJavaとJTAで動作しますが、私はどのようなトランザクション管理Goがサポートしているのか分かりません。 jdbcのように動作する場合は、余分なトランザクションを使用してクエリを行うための余分な接続を作成することができます – aschoerk

関連する問題