Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на TransactionScope с read uncommitted - необходимо ли е с (nolock) в SQL?

Кратък отговор:Не

Дълъг отговор:

Само дефинирането на TransactionScope не дефинира, че всяко четене или запис ще бъде извикано в рамките на транзакция.

За да изпълните нещо в рамките на транзакция, все още трябва да отворите и ангажирате транзакция!

TransactionOptions на TransactionScope за Timeout и IsolationLevel просто дефинирайте по подразбиране за всяка транзакция, създадена в обхвата без изрично зададени тези опции. Всъщност TransactionScope създава транзакция, но тя няма да бъде активна без отваряне на нова транзакция. Вътрешно това ще направи някои сложни неща, клониране на транзакцията и т.н... така че нека игнорираме това...

Без транзакция не можете да дефинирате нивото на изолация, всеки оператор за избор ще се изпълнява с IsolationLevel.ReadCommitted защото това е по подразбиране на SQL Server.

Можете също така да заявите 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 реагира на тези настройки, като използвате SQL Server Profiler.

Просто създайте ново проследяване и внимавайте за Audit Login събитие, текстът на събитието ще включва нивото на изолация и можете да видите, че то всъщност прави Audit Login всеки път, когато се създава транзакция, например

 set transaction isolation level read uncommitted

--

Моля, поправете ме, ако някоя от тази информация може да е грешна, току-що разбрах това сам, така че може да има някакъв потенциал за неуспех;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете първичен ключ в SQL Server (T-SQL примери)

  2. Създайте временна таблица в SQL Server

  3. Предаване на таблица с данни от C# към SQL Server 2008

  4. Sql Server 2008 MERGE - най-добрият начин за получаване на бройки

  5. Как да проверя дали низът е уникален идентификатор?