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

gethostname() POSIX способ получить локальное имя хоста. Выезд man.

функция BSD getdomainname() может дать Вам доменное имя, таким образом, можно создать полностью определенное имя хоста. Нет никакого POSIX способа получить домен, я боюсь.

43
задан gbn 8 October 2009 в 19:10
поделиться

3 ответа

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

2 решения:

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

    IF @@ TRANCOUNT <> 0 ROLLBACK TRAN

  • Используйте SET XACT_ABORT ON , чтобы гарантировать очистку TXN: Вопрос 1 и Вопрос 2

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

Из этого блога группы SQL :

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

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

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

25
ответ дан 26 November 2019 в 23:08
поделиться

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

9
ответ дан 26 November 2019 в 23:08
поделиться

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

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

6
ответ дан 26 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: