sql >> データベース >  >> RDS >> Sqlserver

読み取りがコミットされていない状態でTransactionScopeを使用する-SQLで(nolock)を使用する必要がありますか?

    簡単な答え:いいえ

    長い答え:

    TransactionScopeを定義するだけでは、トランザクション内で読み取りまたは書き込みが呼び出されることは定義されません。

    トランザクション内で何かを実行するには、トランザクションを開いてコミットする必要があります!

    TransactionOptions TimeoutのTransactionScopeの およびIsolationLevel デフォルトを定義するだけです これらのオプションが明示的に設定されていないスコープ内で作成されたトランザクションの場合。実際、TransactionScopeはトランザクションを作成しますが、新しいトランザクションを開かないとアクティブになりません。内部的には、これはトランザクションのクローン作成など、いくつかの複雑な処理を実行します...したがって、これを無視しましょう...

    トランザクションがないと、分離レベルを定義できません。selectステートメントはIsolationLevel.ReadCommittedで実行されます。 これはSQLServerのデフォルトであるためです。

    session.Transaction.IsActiveをクエリすることもできます セッションでトランザクションが現在アクティブかどうかを確認します!

    次のコードを見てみましょう。もう少し明確にするためにコメントを付けます

    using (var scope = new TransactionScope(TransactionScopeOption.Required,
                        new TransactionOptions()
                        {
                            IsolationLevel = IsolationLevel.ReadUncommitted
                        }))
    {
    
        using (var session = sessionFactory.OpenSession())
        {
            // outside any transaction...
            var x = session.Transaction.IsActive; // false;
    
            // read will be done with SQL Server default (ReadCommited)
            var pp = session.Query<Page>().Where(p => p.Photos.Count() > 1).ToList();
    
            using (var transaction = session.BeginTransaction())
            {
                // will use ReadUncommitted according to the scope
                var y = session.Transaction.IsActive; // true;
    
                var p1 = session.Get<Page>(1);
    
                transaction.Commit();
            }
            using (var transaction = session.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
            {
                // will use ReadCommitted according to the transaction initialization
                var y = session.Transaction.IsActive; // true;
    
                var p1 = session.Get<Page>(1);
    
                transaction.Commit();
            }
    
            scope.Complete();
        }
    }
    

    SQL Serverプロファイラーを使用して、SQLServerがこれらの設定にどのように反応するかを確認することもできます。

    新しいトレースを作成し、Audit Loginに注意してください。 イベントの場合、イベントのテキストには分離レベルが含まれ、実際にAudit Loginを実行していることがわかります。 たとえば、トランザクションが作成されるたびに

     set transaction isolation level read uncommitted
    

    -

    この情報のいずれかが間違っている可能性がある場合は、訂正してください。失敗する可能性があるため、自分でこれを理解しました;)



    1. COUNT、GROUP BY、ORDERBYMAXを使用したログファイルのフィルタリング

    2. Javaクロス集計-プリペアドステートメントクエリ

    3. WHERE句を動的/プログラムでSQLに追加します

    4. 24時間でのSQL時間の平均