プログラマーな日々

プログラマーをやっています。好きなものは、C#, TaskChute Cloud, WorkFlowy, Backlog, AWSです。

usingステートメントを使えばSqlTransactionの明示的なRollbackは不要

どういうこと?

SqlTransactionのインスタンスをusingステートメントのスコープで囲めば、例外発生時に自動的にRollbackしてくれます。Try-Catchによる明示的なRollbackは不要です。

どうして?

usingステートメントのスコープを抜けるときにSqlTransactionのDisposeが呼ばれます。Dispose内ではCommitされていなければRollbackが呼ばれます。

どうすれば?

こんなソースコードになります。

using(SqlConnection connection = new SqlConnection([接続文字列])) {
    connection.Open();
    using(SqlTransaction transaction = connection.BeginTransaction())
    using(SqlCommand command = new SqlCommand([クエリー])) {
        command.ExecuteNonQuery();
        transaction.Commit();
    }
}