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