Они откатываются немедленно? Они откатываются через некоторое время? Оставлены ли они в незафиксированном состоянии?
Является ли поведение одинаковым, если используется объединение пулов, а соединения - это просто reset?
Они откатываются немедленно? Они откатываются через некоторое время? Оставлены ли они в незафиксированном состоянии?
Является ли поведение одинаковым, если используется объединение пулов, а соединения - это просто reset?
Он может оставаться открытым, когда применяется объединение пулов. Пример: таймаут команды может оставлять блокировки и TXN, потому что клиент отправляет их как "прервать".
2 решения:
Протестируйте в клиенте буквально:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
Используйте SET XACT_ABORT ON
для обеспечения очистки TXN: Вопрос 1 и Вопрос 2
Я всегда использую SET XACT_ABORT ON
.
Обратите внимание, что при объединении пулов, просто закрывая соединение без откат будет возвращать только подключение к бассейну и транзакция останется открытой до позже повторно использованы или удалены из пула. Это может привести к началу блокировки не нужны и вызывают другие таймауты и прокатный блок
Из MSDN, раздел "Поддержка транзакций" (мой жирный шрифт)
Когда соединение закрыто, оно выпущенный обратно в пул и в соответствующее подразделение, основанное на его контекст транзакции. Следовательно, вы можете закрыть соединение без генерируя ошибку, , хотя распределенная транзакция по-прежнему в ожидании. Это позволяет совершать или прервать распределенную транзакцию на позже.
Неотмечаемые изменения не видны за пределами соединения, поэтому время отката не имеет значения. Итак, да, транзакция в конечном итоге откат.
Сервер будет немедленно откатываться от любой незавершенной транзакции при закрытии сеанса.
Пул ADO отвечает за очистку любой незавершенной транзакции перед возвратом транзакции в пул. Если вы удалите соединение с ожидающими транзакциями, он откатится.
Транзакции могут запускаться клиентом с использованием ADO API (SqlConnection.BeginTransaction) или путем выполнения инструкции BEGIN TRANSACTION. В протоколе TDS между клиентом и сервером есть специальные токены, информирующие клиента, когда транзакция была запущена/завершена так, что ADO знает, что соединение имеет ожидающие транзакции, даже если они запущены в коде T-SQL.