1. ホーム
  2. sql

[解決済み] 読み取りトランザクションをコミットまたはロールバックすべきですか?

2022-12-24 08:59:58

質問

分離レベルを指定できるように、トランザクション内で実行する読み取りクエリを持っています。 クエリが完了したら、どうすればよいですか。

  • トランザクションをコミットします。
  • トランザクションのロールバック
  • 何もしない(usingブロックの終了時にトランザクションをロールバックすることになる)

それぞれを実行することの意味は何ですか?

using (IDbConnection connection = ConnectionFactory.CreateConnection())
{
    using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted))
    {
        using (IDbCommand command = connection.CreateCommand())
        {
            command.Transaction = transaction;
            command.CommandText = "SELECT * FROM SomeTable";
            using (IDataReader reader = command.ExecuteReader())
            {
                // Read the results
            }
        }

        // To commit, or not to commit?
    }
}

EDIT: 問題は、トランザクションを使用すべきかどうか、あるいはトランザクションレベルを設定する他の方法があるかどうかということではありません。 問題は、何も変更しないトランザクションがコミットまたはロールバックされることに何か違いがあるかということです。 パフォーマンスに違いがあるのでしょうか? 他の接続に影響しますか? その他の違いはありますか?

どのように解決するのですか?

コミットする。ピリオドを打つ。他に賢明な選択肢はありません。もしトランザクションを開始したのであれば、それを閉じるべきです。コミットすると持っていたロックが解放されますし、ReadUncommittedやSerializableの分離レベルでも同様に賢明です。暗黙のロールバックに頼ることは - おそらく技術的には同等ですが - 単に貧しいフォームです。

もしこれで納得がいかないのであれば、あなたのコードの途中で update 文を挿入し、暗黙のロールバックが発生してデータを削除するのを追跡しなければならない次の人を想像してみてください。