sql >> Database teknologi >  >> RDS >> Sqlserver

Brug af TransactionScope med read uncommitted - er med (nolock) i SQL nødvendig?

Kort svar:Nej

Langt svar:

Bare det at definere TransactionScope definerer ikke, at nogen læsning eller skrivning vil blive påberåbt i en transaktion.

For at køre noget i en transaktion, skal du stadig åbne og foretage en transaktion!

TransactionOptions af TransactionScope for Timeout og IsolationLevel bare definere standarderne for enhver transaktion, der er oprettet inden for rammerne, uden at disse muligheder udtrykkeligt er angivet. Faktisk opretter TransactionScope en Transaktion, men den vil ikke være aktiv uden at åbne en ny Transaktion. Internt vil dette gøre nogle komplekse ting, kloning af transaktionen osv... så lad os ignorere dette...

Uden en transaktion kan du ikke definere isolationsniveauet, enhver select-sætning vil blive kørt med IsolationLevel.ReadCommitted fordi dette er standard for SQL Server.

Du kan også forespørge session.Transaction.IsActive for at se, om en transaktion i øjeblikket er aktiv for sessionen!

Lad os tage et kig på følgende kode, jeg sætter nogle kommentarer for at gøre det lidt mere klart

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();
    }
}

Du kan også se, hvordan SQL Server reagerer på disse indstillinger ved at bruge SQL Server Profiler.

Bare opret en ny Trace og pas på Audit Login begivenhed, vil teksten til begivenheden inkludere isolationsniveauet, og du kan se, at den faktisk udfører et Audit Login hver gang en transaktion oprettes, f.eks.

 set transaction isolation level read uncommitted

--

Ret mig venligst, hvis nogen af ​​disse oplysninger kan være forkerte, jeg har lige fundet ud af det af mig selv, så der kan være en risiko for fejl;)



  1. Databasen fjernes ikke, når Android-applikationen afinstalleres

  2. Sådan hentes data med samlet antal ved hjælp af mysql enkelt forespørgsel

  3. Den mest effektive måde at flytte tabelrækker fra en tabel til en anden

  4. Hvordan kan du gruppere efter i intervaller i SQL?