トランザクションで次の手順を実行しているとします。
- データベースからデータ A を読み取る
- それに基づいて計算を行います
- データ B をデータベースに書き込む
Aがその間に変更された場合、このトランザクションを失敗させることは可能ですか?
要するに、永続パッケージで分離を実現するにはどうすればよいですか?
トランザクションで次の手順を実行しているとします。
Aがその間に変更された場合、このトランザクションを失敗させることは可能ですか?
要するに、永続パッケージで分離を実現するにはどうすればよいですか?
私自身は使っていませんpersistent
が、Yesod の本には次のように書かれています。
注意すべき重要な点の 1 つは、単一の呼び出し内で発生するすべてのことが
runSqlConn
単一のトランザクションで実行されるということです。これには、次の 2 つの重要な意味があります。
多くのデータベースでは、トランザクションのコミットはコストのかかるアクティビティになる可能性があります。複数のステップを 1 つのトランザクションに入れることで、コードを劇的に高速化できます。
への 1 回の呼び出し内のどこかで例外がスローされた場合
runSqlConn
、すべてのアクションがロールバックされます (バックエンドがロールバックをサポートしていると仮定します)。
これにより分離が保証されるかどうかは、おそらく、指定されたバックエンドがトランザクションの分離を保証するかどうかによって異なります。