Може да остане отворен, докато се прилага обединяването на връзки. Пример:времето за изчакване на командата може да остави заключвания и TXN, защото клиентът изпраща като "прекратяване".
2 решения:
-
Тествайте в клиента, буквално:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
-
Използвайте
SET XACT_ABORT ON
за да сте сигурни, че TXN е изчистен:Въпрос 1 и Въпрос 2
Винаги използвам SET XACT_ABORT ON
.
От този блог на SQL Team:
Обърнете внимание, че при обединяване на връзки просто затваряне на връзката без връщане назад само ще върне връзката към пула и транзакцията ще остане отворена, докато по-късно не бъде използвана повторно или премахната от пула. Това може да доведе до ненужно задържане на заключвания и да причини други изчаквания и преместване на блока
От MSDN, раздел „Поддръжка на транзакции“ (моят получер)
Когато една връзка е затворена, тя се освобождава обратно в пула и в съответното подразделение въз основа на нейния транзакционен контекст. Следователно, можете да затворите връзката, без да генерирате грешка, въпреки че разпределената транзакция все още е в процес. Това ви позволява да ангажирате или да прекъснете разпределената транзакция по-рано.