Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Какво се случва с незавършена транзакция, когато връзката е затворена?

Може да остане отворен, докато се прилага обединяването на връзки. Пример:времето за изчакване на командата може да остави заключвания и TXN, защото клиентът изпраща като "прекратяване".

2 решения:

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

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

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

Винаги използвам SET XACT_ABORT ON .

От този блог на SQL Team:

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

От MSDN, раздел „Поддръжка на транзакции“ (моят получер)

Когато една връзка е затворена, тя се освобождава обратно в пула и в съответното подразделение въз основа на нейния транзакционен контекст. Следователно, можете да затворите връзката, без да генерирате грешка, въпреки че разпределената транзакция все още е в процес. Това ви позволява да ангажирате или да прекъснете разпределената транзакция по-рано.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Актуализирайте записите в таблицата от CTE

  2. Клауза WHERE IS NULL, IS NOT NULL или NO WHERE в зависимост от стойността на параметъра на SQL Server

  3. Какво е съхранена процедура?

  4. Представяме ви нова функция - Отчет за растежа на облачната база данни на Spotlight

  5. Създайте разделена таблица в SQL Server (T-SQL)