Se una transazione viene "impegnata", viene salvata di sicuro?


12

Se una transazione viene eseguita correttamente, posso essere sicuro al 100% che è stata scritta nel database E nei file di registro? Posso essere sicuro che i dati siano SALVATI?

Oggi i nostri file di registro hanno raggiunto il limite dell'unità e abbiamo riscontrato molti errori. Inoltre, alcuni altri servizi si sono arrestati in modo anomalo. Abbiamo aumentato il disco e riavviato il server.

Durante l'avvio, il server ha eseguito un "ripristino del database" - posso essere sicuro che tutto sia di nuovo a posto?


2
È possibile controllare il registro degli errori al termine del ripristino per vedere quante transazioni sono state sottoposte a commit e quante sono state ripristinate. Non esiste una risposta magica a questo: se un disco si è bloccato, allora tutto dipende dallo stato delle transazioni in quel momento.
Aaron Bertrand

1
@AaronBertrand Ma se una transazione è nello stato "impegnata" (ovvero il commit è andato a buon fine), come potrebbe essere possibile che si perda ancora durante il recupero?
SQL Police

3
@Giosco: non può. "commit" significa che si trova nel file di registro del database. L'unico modo per perderlo è quello di 1) perdere il file di registro prima che venga salvato anche nel file di dati, oppure 2) perdere sia il file di registro che il file di dati, oppure 3) errore umano. Si noti che (3) è in genere il più probabile.
RBarryYoung,

2
@Giosco come fai a sapere che tutte le tue transazioni al momento del drive completo sono state eseguite correttamente?
Aaron Bertrand

2
Transazione di procedura memorizzata <>: la procedura memorizzata può avere più transazioni esplicite o solo implicite, potrebbe esserci una logica try / catch, potrebbe esserci una gestione delle transazioni a livello C #, ecc. Ecc. Ancora una volta, supponendo che nessuna eccezione = commit riuscito potrebbe essere un po 'troppo pericoloso come una dichiarazione generale.
Aaron Bertrand

Risposte:


16

Se un'applicazione client ha emesso un COMMIT e ha restituito un codice di successo, la transazione è garantita dal motore per essere durevole. È garantito che tutte le modifiche apportate a una transazione saranno visibili, anche dopo un arresto anomalo. Inoltre, il recupero garantisce anche il rollback di qualsiasi transazione non impegnata in caso di crash.

Per maggiori dettagli ti consiglio di leggere il documento ARIES .

La registrazione e il ripristino write-ahead non possono garantire se l'hardware di archiviazione sottostante presenta errori (corruzione). E qualsiasi prodotto di ingegneria può contenere difetti.

La tua applicazione, come tutte le altre applicazioni, deve essere accuratamente scritta per comportarsi correttamente in presenza di arresti anomali (errori). Non c'è magia.


Se un'applicazione client ha emesso un COMMIT ma nessuna risposta dal DB viene ricevuta fino al timeout sul lato client. E questo impegno? successo o fallimento? Come controllare?
Gab 是 好人
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.