異なるトランザクションでのEntity更新処理によるロストアップデート?の対策
※DBの想定としてはMySQLでデフォルトのRepeatable Readです。
質問内容
・複数のリクエストでほぼ同時にEntityを取得し、それぞれ更新処理をする際にロストアップデートが起きるのではないか
例:銀行口座に50万円があったとして、ほぼ同時に
- 口座の持ち主が30万円引き出す。
- 銀行が40万円の自動振替を行う
を行った場合に、異なるトランザクションで口座残高が50万円のEntityが2つ作成され
それぞれEntityへの操作を行うことで口座残高が変更されたEntityがRepositoryを介してDBに保存されます。
この時に期待する処理は上記2つの処理が直列的に実行され、自動振替を行う際に残高がマイナスになりエラーが発生することです。
ですが2つの処理は同時に残高50万円の状態のEntityを保持しているため、更新時には
1.残高20万円で保存される
2.残高10万円で保存される
となり元々ある残高以上の取引が行われてしまい、最終的に残高10万円でDBに保存されてしまいます。
考えた対策
口座を更新する際には排他ロックをかけることで複数のリクエストに参照させないことで防ぐことができると思うのですが、ロックすることで待機時間が増えてしまうということもあり他の方法を考えています。
他に方法があれば教えていただきたいです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/04/12 02:53