Что происходит с незафиксированной транзакцией, когда соединение закрыто? - PullRequest
42 голосов
/ 08 октября 2009

Они сразу откатились? Они откатились через какое-то время? Они остались в незафиксированном состоянии?

Является ли поведение таким же, если используется пул соединений и соединения просто сбрасываются?

Ответы [ 3 ]

25 голосов
/ 08 октября 2009

Может оставаться открытым, пока применяется пул соединений. Пример: команда timeout может оставить блокировки и TXN, потому что клиент отправляет как «abort».

2 решения:

  • Тест на клиенте, буквально:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

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

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

С этого блога команды SQL :

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

С MSDN , раздел «Поддержка транзакций» (выделено жирным шрифтом)

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

9 голосов
/ 08 октября 2009

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

6 голосов
/ 08 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...