2009-09-21 20 views
8

Aprire il file di database e ottenere una connessione al database utilizzando il metodo open() di sqlite3 e la connessione non verrà chiusa fino alla chiusura del programma. Se si verifica un errore imprevisto, ad esempio improvviso spegnimento del computer o arresto anomalo del sistema operativo, la modalità del file di database verrà danneggiata o il suo handle verrà perso? Più specificamente, può rimanere scrivibile se riavvio il mio computer? A proposito, non mi interessa la perdita di dati quando si verificano errori.Il file di database di SQLite3 verrà danneggiato in caso di spegnimento improvviso o arresto anomalo del sistema operativo?

Grazie mille!

risposta

12

SQLite è specificatamente progettato per proteggere da questo. Dalla ufficiale SQLite is Transactional pagina:

Tutte le modifiche all'interno di una singola un'operazione a SQLite o si verificano completamente o non del tutto, anche se l' atto di scrivere il cambiamento verso il disco è interrotta da

  • un crash del programma,
  • un crash del sistema operativo, o
  • un'interruzione di corrente.

L'affermazione del paragrafo precedente è ampiamente controllati sul suite di test di regressione SQLite utilizzando un test speciale imbracatura che simula le effetti su un file di database di crash del sistema operativo e la potenza fallimenti.

Potreste anche essere interessati a questo articolo SQLite Atomic Commit in SQLite se avete bisogno di conoscere i dettagli specifici su come si proteggono contro gli arresti, come sopra.


Riguardo scrittura dopo un incidente: (da File Locking and Concurrency)

Un diario calda viene creato quando un processo è nel mezzo di un aggiornamento del database e un programma o sistema operativo crash o di mancanza di corrente impedisce la aggiornamento dal completamento. Giornali caldi sono una condizione di eccezione. Esistono periodici caldi per il ripristino da arresti anomali e interruzioni di corrente. Se tutto funziona correttamente (ovvero, se non si verificano arresti anomali o interruzioni dell'alimentazione) non si otterrà mai un diario caldo.

Il peggio che può succedere è che è necessario eliminare il diario attivo rimasto dopo un arresto anomalo.

+0

Grazie! Voglio anche sapere se il file di database (*. Db) rimarrà scrivibile se si verifica un'interruzione dell'alimentazione mentre nel database sono state apportate alcune modifiche. – quantity

+0

@quantity Il blocco viene eseguito a livello di sistema operativo, quindi dopo un errore improvviso e dopo il riavvio, il codice fschk dovrebbe cancellarlo e il file sarà nuovamente accessibile.Il blocco non viene effettuato cambiando gli attributi del file. Inoltre, dai riferimenti degli articoli nella risposta, è chiaro che le "riviste a caldo" vengono gestite automaticamente quando si accede al file DB. – Ber

+0

Non si dovrebbe mai cancellare un file di giornale caldo. Vedere la documentazione ufficiale: [Come danneggiare un file di database SQLite] (http://www.sqlite.org/howtocorrupt.html), sezione 1.3. –

1

qualsiasi cosa potrebbe accadere in caso di spegnimento improvviso. Comunque suggerirei UPS per mitigare qualsiasi rischio.

+0

E qualsiasi cosa può accadere a causa dei raggi cosmici, ma in pratica, un database sqlite3 generalmente rimarrà coerente in caso di improvvisa perdita di alimentazione su file system prevedibili. – Arelius

4

Poiché Sqlite è compatibile con ACID, lo spegnimento non dovrebbe essere un problema.

http://en.wikipedia.org/wiki/ACID

+0

Ho paura che lo spegnimento influenzi le proprietà del file e non verrà aperto affatto o non posso scrivere alcun dato al suo interno. – quantity

+0

@quantity, perché ne hai paura? Finché non si elimina il file journal, sqlite3 dovrebbe essere in grado di riparare il database in caso di improvvisa perdita di alimentazione. – Arelius