В нашем коде у нас есть код, который создает область транзакции 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, так что, возможно, это часть поведения?