2009-10-08 13 views

risposta

22

Può rimanere aperto mentre si applica il pool di connessioni. Esempio: il timeout del comando può lasciare blocchi e TXN perché il client invia come "abort".

2 soluzioni:

  • prova nel client, letteralmente:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Utilizzare SET XACT_ABORT ON toensured un TXN viene ripulito: Question 1 e Question 2

Io uso sempre SET XACT_ABORT ON.

Da this SQL Team blog:

noti che con il pool di connessioni, semplicemente chiudendo la connessione senza un ripristino restituirà solo la connessione alla piscina e la transazione rimarrà aperta fino successivamente riutilizzato o rimossi dalla piscina Ciò può provocare blocchi cominciano tenuto inutili e causare altri timeout e blocco a rotazione

Da MSDN, sezione "Supporto delle transazioni" (il mio grassetto)

Quando una connessione è chiusa, è rilasciato nuovamente nel pool e in la suddivisione appropriata basata su il suo contesto di transazione. Pertanto, è possibile chiudere la connessione senza generando un errore, anche se una transazione distribuita è ancora in sospeso.Ciò consente di eseguire il commit o interrompere la transazione distribuita in un secondo tempo .

+1

Il pool di connessioni avviene sul lato client, quindi se il client interrompe internamente una connessione senza chiuderla effettivamente di quanto non sia responsabile per l'emissione di un rollback o per fare tutto ciò che è necessario per risolvere questa situazione. – Fozi

+0

@Fozi: a meno che non sia impostato SET XACT_ABORT ON. – gbn

10

Le modifiche non concesse non sono visibili al di fuori della connessione, quindi l'ora del rollback è irrilevante. Quindi sì, alla fine la transazione viene annullata.

+9

Ma può appendere altre connessioni (in attesa di un commit/rollback) a seconda del vostro isolamento per cui i tempi è ancora importante. –

+2

Corretto, ma l'enfasi è "alla fine", che è una cosa * cattiva * – gbn

+0

Suppongo che venga eseguito il rollback non appena la connessione TCP (o qualsiasi altra cosa) risulti chiusa/interrotta. Per il pooling delle connessioni, vedere la risposta di gbn. – Fozi

6

Il server eseguirà il rollback di tutte le transazioni non richiamate quando una sessione viene chiusa.
Il pool ADO è responsabile per cancellare qualsiasi transazione non salvata prima di restituire una transazione al pool. Se si dispone di una connessione con transazioni in sospeso, verrà eseguito il rollback.

Le transazioni possono essere avviate dal client utilizzando l'API ADO (SqlConnection.BeginTransaction) o eseguendo un'istruzione BEGIN TRANSACTION. Il protocollo TDS tra client e server dispone di token speciali che informano il client quando una transazione è stata avviata/avviata in questo modo, quindi ADO sa che la connessione ha transazioni in sospeso anche se sono state avviate nel codice T-SQL.

Problemi correlati