Se non esegui il rollback di una transazione, la modifica verrà comunque effettuata?


10

Di 'che sto eseguendo una query

begin tran

update users
set name = 'Jimmy'
where name = 'john'

Se non eseguo il rollback della transazione, queste modifiche verranno comunque apportate, genererà un errore o fungerà comunque da rollback?


Immagino che ciò dipenda dal comportamento del software client utilizzato per eseguire queste dichiarazioni o l'applicazione in cui sono incorporate. Alcuni potrebbero eseguire il commit automatico se configurato (SSMS lo farà per impostazione predefinita).
Mustaccio,

3
Le transazioni dichiarate esplicitamente non si impegnano automaticamente. Poiché Josh ha dichiarato l'inizio di una transazione, si comporterà esattamente come ha risposto Justin Cave.
Dave,

Risposte:


16

Devi capire cos'è una transazione - È una singola unità di lavoro. È TUTTO o NIENTE (segue le proprietà ACID ) e ciò garantisce la coerenza del database.

Se NON eseguo il rollback della transazione, queste modifiche verranno comunque apportate

Le modifiche verranno apportate solo se ti impegni. Il server SQL registra tutte le modifiche nel registro delle transazioni e, una volta effettuato il commit, vengono ripristinate nel file di dati.

Se non ti impegni, la tua transazione rimarrà APERTA indefinitamente, cosa che puoi vedere sys.dm_tran_active_transactions / sys.dm_tran_database_transactions / sys.dm_tran_session_transactionso utilizzare DBCC OPENTRAN.

Inoltre, ciò che è stato avviato è una transazione esplicita , che deve essere esplicitamente conclusa con un'istruzione COMMIT o ROLLBACK.

Leggi anche - È una cattiva pratica creare sempre una transazione?


@JoshStevenson Penso che valga la pena di leggere Atomic Operations nel contesto del database.
Nelz,

12

Se non si esegue il commit né il rollback della transazione, la transazione continuerà a esistere indefinitamente. Continuerà a mantenere i suoi blocchi, potenzialmente bloccando altre sessioni, fino a quando non si termina la transazione tramite un commito un rollbacko fino a quando un DBA arriva e uccide la sessione (o fino a quando qualcosa come un singhiozzo di rete non interrompe la connessione). Se un DBA uccide la sessione, emetterà implicitamente un rollback per questa e tutte le altre transazioni aperte.


Questa è la risposta corretta Senza questa informazione non aveva senso che le dichiarazioni COMMIT e ROLLBACK fossero usate del tutto.
Tarec,

1

Le modifiche non verranno apportate fino a quando, a meno che la transazione non venga impegnata, non risponda a tutto o niente come indicato sopra,

L'atomicità è il motivo dietro questo, è possibile controllare le proprietà della transazione ACID, sono le proprietà fondamentali che seguono un sistema di database.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.