Я пытаюсь использовать System.Transaction.TransactionScope для создания транзакции для вызова нескольких хранимых процедур, но, похоже, она не очищается после себя. Как только транзакция завершена (зафиксирована или нет и объект области транзакции удален), последующие соединения с базой данных открываются с уровнем фиксации чтения сериализуемого, а не фиксацией чтения, как обычно.
Я открываю и закрываю соединение для каждого вызова (хорошо закрываю и возвращаюсь в пул соединений, как обычно в .NET), мне не хватает способа явно сбросить соединение, когда я закончу использовать его для транзакции? Я думал, что идея System.Transaction.TransactionScope заключалась в том, чтобы скрыть всю сложность.
Итак, мой код выглядит так:
using (var scope = new TransactionScope())
{
... make my 3 stored procedure calls ...
scope.Complete();
return returnCode;
}
что я думаю, это нормальный способ сделать это. Но затем, если я посмотрю в профилировщик sqlserver, я вижу, что соединения открываются с помощью
set transaction isolation level serializable
что мешает последующей деятельности базы данных, не связанной с транзакциями, а также, по-видимому, не так быстро. Я могу обойти это, установив параметр транзакции на явное выполнение транзакции с помощью ReadCommited, но, на мой взгляд, это не идеальное поведение для этой операции.
Я также пробовал явно создать объект Commitabletransaction, создав явные новые транзакции вместо использования внешней, и все равно не повезло.
Мы будем очень благодарны за любые идеи о том, как это исправить, поскольку любые вызовы, использующие сериализуемое соединение, вызовут ошибку, если они попытаются использовать подсказку блокировки readpast.