世の中には、次のようなデータベース トランザクションの明示的なロールバックを推奨する例が数多くあります。
using (var transaction = ...)
{
try
{
// do some reading and/or writing here
transaction.Commit();
}
catch (SqlException ex)
{
// explicit rollback
transaction.Rollback();
}
}
しかし、私は次のようにする傾向があります:
using (var transaction = ...)
{
// do some reading and/or writing here
transaction.Commit();
}
例外が発生した場合、コミットされていないトランザクションの暗黙的なロールバックに頼ることになります。
この暗黙の動作に頼ることに何か問題はありますか? このようにすべきではないという説得力のある理由を持っている人はいますか?
ベストアンサー1
いいえ、特に必要というわけではありませんが、それが良いアイデアであるかもしれない理由が 2 つ考えられます。
- 明瞭性
transaction.Rollback()
を使用すると、どのような状況でトランザクションがコミットされないかがより明確になると主張する人もいるかもしれません。
- ロックを解除する
トランザクションを扱う場合、特定のロックはトランザクションがロールバックまたはコミットされたときにのみ解除されることを認識することが重要です。ステートメントを使用している場合using
、トランザクションはトランザクションが破棄されるときにロールバックされますが、何らかの理由でブロック内でエラー処理を実行する必要がある場合はusing
、複雑で時間のかかるエラー処理を実行する前にトランザクションをロールバック (ロックを削除) すると有利になる場合があります。