Я немного борюсь с областями транзакций и инфраструктурой сущностей.
Изначально мы хотим, чтобы все наши соединения в приложении использовали уровень изоляции моментальных снимков при чтении данных, но в некоторых случаях мы хотим читать данные либо с прочитанным, либо с прочитанным уровнем незафиксированной изоляции, и для этого мы будем использовать области транзакций для изменения уровень изоляции временный для запросов (как указано в нескольких сообщениях здесь и в разных блогах).
Однако проблема заключается в том, что при размещении области транзакции изоляция по-прежнему остается в соединении, что вызывает немало проблем.
Я пробовал все типы вариаций, но с тем же результатом; уровень изоляции сохраняется за пределами транзакции.
Есть ли кто-нибудь, кто может объяснить это поведение для меня или может объяснить, что я делаю неправильно?
Я нашел обходной путь для проблемы, инкапсулируя область транзакций в одноразовый класс, который возвращает уровень изоляции для меня, но я был бы признателен за хорошее объяснение этого поведения, я думаю, что это поведение влияет не только на мои код, но и другие.
Вот пример кода, который иллюстрирует проблему:
using (var context = new MyContext())
{
context.Database.Connection.Open();
//Sets the connection to default read snapshot
using (var command = context.Database.Connection.CreateCommand())
{
command.CommandText = "SET TRANSACTION ISOLATION LEVEL SNAPSHOT";
command.ExecuteNonQuery();
}
//Executes a DBCC USEROPTIONS to print the current connection information and this shows snapshot
PrintDBCCoptions(context.Database.Connection);
//Executes a query
var result = context.MatchTypes.ToArray();
//Executes a DBCC USEROPTIONS to print the current connection information and this still shows snapshot
PrintDBCCoptions(context.Database.Connection);
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadCommitted //Also tried ReadUncommitted with the same result
}))
{
//Executes a DBCC USEROPTIONS to print the current connection information and this still shows snapshot
//(This is ok, since the actual new query with the transactionscope isn't executed yet)
PrintDBCCoptions(context.Database.Connection);
result = context.MatchTypes.ToArray();
//Executes a DBCC USEROPTIONS to print the current connection information and this has now changed to read committed as expected
PrintDBCCoptions(context.Database.Connection);
scope.Complete(); //tested both with and without
}
//Executes a DBCC USEROPTIONS to print the current connection information and this is still read committed
//(I can find this ok too, since no command has been executed outside the transaction scope)
PrintDBCCoptions(context.Database.Connection);
result = context.MatchTypes.ToArray();
//Executes a DBCC USEROPTIONS to print the current connection information and this is still read committed
//THIS ONE is the one I don't expect! I expected that the islation level of my connection should revert here
PrintDBCCoptions(context.Database.Connection);
}