Risposte:
Finché non COMMIT o ROLLBACK una transazione, è ancora "in esecuzione" e potenzialmente con blocchi.
Se il client (applicazione o utente) chiude la connessione al database prima di eseguire il commit, tutte le transazioni ancora in esecuzione verranno annullate e terminate.
Puoi effettivamente provarlo da solo, questo dovrebbe aiutarti a farti un'idea di come funziona.
Aprire due finestre (schede) in Management Studio, ognuna di esse avrà la propria connessione a sql.
Ora puoi iniziare una transazione in una finestra, fare alcune cose come inserire / aggiornare / eliminare, ma non ancora eseguire il commit. quindi nell'altra finestra puoi vedere come appare il database dall'esterno della transazione. A seconda del livello di isolamento, la tabella potrebbe essere bloccata fino al commit della prima finestra, oppure potresti (non) vedere cosa ha fatto l'altra transazione fino a quel momento, ecc.
Gioca con i diversi livelli di isolamento e nessun suggerimento di blocco per vedere come influenzano i risultati.
Guarda anche cosa succede quando lanci un errore nella transazione.
È molto importante capire come funzionano tutte queste cose o rimarrai perplesso da ciò che fa sql, molte volte.
Divertiti! GJ.
Le transazioni sono destinate a essere eseguite completamente o per niente. L'unico modo per completare una transazione è eseguire il commit, qualsiasi altro modo comporterà un rollback.
Pertanto, se si inizia e poi non si esegue il commit, verrà eseguito il rollback alla chiusura della connessione (poiché la transazione è stata interrotta senza essere contrassegnata come completa).
dipende dal livello di isolamento della transazione in entrata.
Quando apri una transazione nulla viene bloccato da solo. Ma se esegui alcune query all'interno di quella transazione, a seconda del livello di isolamento, alcune righe, tabelle o pagine vengono bloccate, quindi influirà su altre query che tentano di accedervi da altre transazioni.
Esempio di transazione
inizio tran tt
Le tue dichiarazioni sql
se si è verificato un errore, eseguire il rollback tran tt, altrimenti eseguire il commit
Finché non si è eseguito il commit tran tt, i dati non verranno modificati
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
non funziona, per esempio. Vedere stackoverflow.com/questions/1273376/...
Oltre ai potenziali problemi di blocco che potresti causare, scoprirai anche che i tuoi registri delle transazioni iniziano a crescere poiché non possono essere troncati oltre l'LSN minimo per una transazione attiva e se stai usando l'isolamento dello snapshot il tuo archivio delle versioni in tempdb crescerà per ragioni simili.
È possibile utilizzare dbcc opentran
per visualizzare i dettagli della transazione aperta più vecchia.
Qualsiasi transazione non eseguita lascerà il server bloccato e altre query non verranno eseguite sul server. È necessario eseguire il rollback della transazione o eseguirne il commit. La chiusura di SSMS terminerà anche la transazione che consentirà l'esecuzione di altre query.
Il comportamento non è definito, quindi è necessario impostare esplicitamente un commit o un rollback:
http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303
"Se la modalità di commit automatico è disabilitata e chiudi la connessione senza eseguire esplicitamente il commit o il rollback delle ultime modifiche, viene eseguita un'operazione COMMIT implicita."
Hsqldb esegue un rollback
con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')");
con.close();
il risultato è
2011-11-14 14: 20: 22,519 INFO principale [SqlAutoCommitExample: 55] [AutoCommit enabled = false] 2011-11-14 14: 20: 22,546 INFO principale [SqlAutoCommitExample: 65] [Trovato 0 # utenti nel database]