Я пытаюсь использовать System.Transaction.TransactionScope для создания транзакции для вызова нескольких хранимых процедур, но, похоже, не очищается после себя. Как только транзакция завершена (завершена или нет, и объект области транзакции будет удален), последующие соединения с базой данных будут открываться с уровнем фиксации чтения сериализуемым, а не читать, как обычно.System.Transaction неявная транзакция с другими моими подключениями
Я открываю и закрываю соединение для каждого вызова (хорошо закрывая и возвращаясь к пулу подключений, как обычно в .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 lock.
Я определенно вижу связи sp_reset.Я могу пройти и увидеть, что каждое соединение явно закрыто. Как вы относитесь к воспроизведению проблемы сериализации? Я использую систему только тогда, когда пытаюсь это сделать, и у меня нет никаких взаимоблокировок (проверка трассировки на профилировщике и протоколе транзакций). – mjallday
Я имею в виду: вы утверждаете, что это мешает «последующей деятельности, связанной с транзакциями, связанной с базой данных», ; Я говорю: «ты уверен?». Я подозреваю, что sp_reset_connection означает, что последующая активность db не зависит от этого уровня изоляции. –
Чтобы убедиться в этом, вам нужно будет проверить, выполнены ли дополнительные блокировки. Одним из вариантов является сценарий эскалации блокировки - то есть spid A считывает строку (без UPDLOCK), spid B считывает строку, A пытается обновить строку, B пытается обновить строку. Если эти взаимоблокировки, штифты являются сериализуемыми. –