Что происходит с незафиксированной транзакцией при закрытии соединения?

Они откатываются немедленно? Они откатываются через некоторое время? Оставлены ли они в незафиксированном состоянии?

Является ли поведение одинаковым, если используется объединение пулов, а соединения - это просто reset?

Ответ 1

Он может оставаться открытым, когда применяется объединение пулов. Пример: таймаут команды может оставлять блокировки и TXN, потому что клиент отправляет их как "прервать".

2 решения:

  • Протестируйте в клиенте буквально:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Используйте SET XACT_ABORT ON для обеспечения очистки TXN: Вопрос 1 и Вопрос 2

Я всегда использую SET XACT_ABORT ON.

От этот блог SQL Team:

Обратите внимание, что при объединении пулов, просто закрывая соединение без откат будет возвращать только подключение к бассейну и транзакция останется открытой до позже повторно использованы или удалены из пула. Это может привести к началу блокировки не нужны и вызывают другие таймауты и прокатный блок

Из MSDN, раздел "Поддержка транзакций" (мой жирный шрифт)

Когда соединение закрыто, оно выпущенный обратно в пул и в соответствующее подразделение, основанное на его контекст транзакции. Следовательно, вы можете закрыть соединение без генерируя ошибку, , хотя распределенная транзакция по-прежнему в ожидании. Это позволяет совершать или прервать распределенную транзакцию на позже.

Ответ 2

Неотмечаемые изменения не видны за пределами соединения, поэтому время отката не имеет значения. Итак, да, транзакция в конечном итоге откат.

Ответ 3

Сервер будет немедленно откатываться от любой незавершенной транзакции при закрытии сеанса.
Пул ADO отвечает за очистку любой незавершенной транзакции перед возвратом транзакции в пул. Если вы удалите соединение с ожидающими транзакциями, он откатится.

Транзакции могут запускаться клиентом с использованием ADO API (SqlConnection.BeginTransaction) или путем выполнения инструкции BEGIN TRANSACTION. В протоколе TDS между клиентом и сервером есть специальные токены, информирующие клиента, когда транзакция была запущена/завершена так, что ADO знает, что соединение имеет ожидающие транзакции, даже если они запущены в коде T-SQL.