sql >> Database >  >> RDS >> Sqlserver

Gebruik van TransactionScope met read uncommitted - is met (nolock) in SQL noodzakelijk?

Kort antwoord:Nee

Lang antwoord:

Alleen het definiëren van de TransactionScope definieert niet dat lezen of schrijven binnen een transactie zal worden aangeroepen.

Om iets binnen een transactie uit te voeren, moet u nog steeds een transactie openen en vastleggen!

De TransactionOptions van de TransactionScope voor Timeout en IsolationLevel definieer gewoon de standaardinstellingen voor elke transactie die binnen het bereik is gemaakt zonder dat deze opties expliciet zijn ingesteld. Eigenlijk creëert de TransactionScope wel een Transactie, maar deze zal niet actief zijn zonder een nieuwe Transactie te openen. Intern zal dit een aantal complexe dingen doen, de transactie klonen enz... dus laten we dit negeren...

Zonder een transactie kunt u het isolatieniveau niet definiëren, elke select-opdracht wordt uitgevoerd met IsolationLevel.ReadCommitted omdat dit de standaard is van SQL Server.

U kunt ook session.Transaction.IsActive . opvragen om te zien of er momenteel een transactie actief is voor de sessie!

Laten we de volgende code eens bekijken, ik heb wat opmerkingen geplaatst om het een beetje duidelijker te maken

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

U kunt ook zien hoe SQL Server op die instellingen reageert door de SQL Server Profiler te gebruiken.

Maak gewoon een nieuwe Trace en kijk uit voor de Audit Login gebeurtenis, bevat de tekst van de gebeurtenis het isolatieniveau en kunt u zien dat er daadwerkelijk een Audit Login wordt uitgevoerd elke keer dat een transactie wordt aangemaakt, bijvoorbeeld

 set transaction isolation level read uncommitted

--

Corrigeer me als een van deze informatie onjuist zou kunnen zijn, ik heb dit zelf bedacht, dus er kan een kans zijn dat het misgaat;)



  1. RoR Postgresql-tijdzonegroep door niet te werken aan Heroku

  2. Hoe u een set gegevens beter kunt dupliceren in SQL Server

  3. Een MySQL-schema-parser in Java?

  4. geoip postcode query