Транзакция, созданная с помощью RequNew, может видеть данные окружающих транзакций на сервере SQL. - PullRequest
0 голосов
/ 06 февраля 2020

В нашем коде у нас есть код, который создает область транзакции ReadCommitted с TransactionScopeOption.RequiresNew (это, вероятно, должно быть просто New, но это имеет другие последствия, с которыми нам нужно ознакомиться)

В этом коде мы иногда необходимо создать отдельную транзакцию с изменениями данных, которые необходимо завершить, даже если внешняя транзакция должна была быть прервана. Для этого мы создаем новую область транзакции ReadCommited с помощью TransactionScopeOption.RequiresNew

. Меня смущает то, что код, который выполняется внутри области транзакции requireNew, может получать доступ к данным, которые изменяются внутри внешней транзакции. Например ..

{
   using(var scope = TransactionUtils.CreateNewTransactionScope()) // will be created with RequiresNew
   {
      // Create a new record in dbo.MyDataTable which gets an Id of 1
      using (var innerScope = TransactionUtils.CreateNewTransactionScope()) // will be created with RequiresNew
      {
        // SELECT * from dbo.MyDataTable where Id = 1 will return the record?!?
      }

   }
}

Единственное, что имеет смысл, - это если RequNews разрешает доступ к данным транзакций Ambient, но я не могу найти какую-либо документацию, подтверждающую это. Является ли это ожидаемым поведением, и есть ли в SQL Spe c что-то, на что можно указать?

Еще одна вещь, которую стоит упомянуть, это то, что у нас действительно READ_COMMITTED_SNAPSHOT ON, так что, возможно, это часть поведения?

...