2009-10-08 2 views
34

Снова ли они откатываются? Откатились они после некоторого периода времени? Остались ли они в незафиксированном состоянии?Что происходит с незафиксированной транзакцией при закрытии соединения?

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

+0

Связанный: http://stackoverflow.com/q/4978372/1569 –

ответ

22

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

2 решения:

  • испытаний в клиенте, в буквальном смысле:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Используйте SET XACT_ABORT ON, чтобы обеспечили TXN очищается: Question 1 и Question 2

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

От this SQL Team blog:

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

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

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

+1

Пул соединений происходит на стороне клиента, поэтому, если клиент внутренне прерывает соединение, не закрывая его, он отвечает за выпуск отката или делает все, что ему нужно для разрешения этой ситуации. – Fozi

+0

@Fozi: если у вас нет SET XACT_ABORT ON. – gbn

10

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

+9

Но он может повесить другие соединения (ожидания для фиксации/отката) в зависимости от вашей изоляции так что время все еще имеет значение. –

+2

Правильно, но упор делается «в конечном итоге», что является «плохой вещью». – gbn

+0

Я думаю, что он откатывается, как только известно, что TCP (или другое) соединение закрыто/сломано. Для объединения пулов см. Ответ gbn. – Fozi

6

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

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