Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Cosa succede a una transazione non vincolata quando la connessione viene chiusa?

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.