Può rimanere aperto mentre si applica il pool di connessioni. Esempio:il timeout del comando può lasciare lock e TXN perché il client invia come "abort".
2 soluzioni:
-
Testare nel client, letteralmente:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
-
Usa
SET XACT_ABORT ON
per assicurarsi che un TXN sia ripulito:Domanda 1 e Domanda 2
Uso sempre SET XACT_ABORT ON
.
Da questo blog di SQL Team:
Tieni presente che con il pool di connessioni, la semplice chiusura della connessione senza un rollback restituirà solo la connessione al pool e la transazione rimarrà aperta fino a quando non verrà riutilizzata o rimossa dal pool. Ciò può comportare che i blocchi inizino a essere ritenuti non necessari e causino altri timeout e blocchi continui
Da MSDN, sezione "Supporto per le transazioni" (il mio grassetto)
Quando una connessione viene chiusa, viene rilasciata nuovamente nel pool e nella suddivisione appropriata in base al contesto della transazione. Pertanto, puoi chiudere la connessione senza generare un errore, anche se la transazione distribuita è ancora in sospeso. Ciò ti consente di eseguire il commit o di annullare la transazione distribuita in un secondo momento.