2009-09-21 7 views
8

Abro el archivo de base de datos y obtengo una conexión de base de datos usando el método open() de sqlite3 y la conexión no se cerrará hasta que el programa salga. Si se produce un error inesperado, como el apagado repentino de la computadora o el bloqueo del sistema operativo, ¿se dañará el modo del archivo de la base de datos o se perderá su identificador? Más específicamente, ¿puede permanecer escrito si reinicio mi computadora? Por cierto, no me importa la pérdida de datos cuando se producen errores.¿Se dañará el archivo de base de datos de SQLite3 cuando de repente se apague o se bloquee el sistema operativo?

¡Muchas gracias!

Respuesta

12

SQLite es específicamente diseñado para protegerse de esto. Desde el funcionario SQLite is Transactional página:

Todos los cambios dentro de una única transacción en SQLite o bien se producen por completo o en absoluto, incluso si el acto de escribir el cambio a cabo en el disco es interrumpido por

  • una caída del programa,
  • una caída del sistema operativo, o
  • un fallo de alimentación.

La afirmación del párrafo anterior es contrastados extensamente en el banco de pruebas de regresión SQLite utilizando un arnés de prueba especial que simula los efectos en un archivo de base de datos de sistema operativo se bloquea y el poder fracasos.

Puede que también le interese el artículo de SQLite Atomic Commit in SQLite si necesita conocer los detalles específicos sobre cómo protegerse contra fallas como las anteriores.


En cuanto a la escritura después de un accidente: (de File Locking and Concurrency)

Se crea una revista caliente cuando un proceso está en medio de una actualización de base de datos y una caída del programa o el sistema operativo o el fracaso, evita la actualización de completar. Los diarios calientes son una condición de excepción. Existen revistas activas para recuperarse de fallas y fallas de energía. Si todo está funcionando correctamente (es decir, si no hay bloqueos ni fallas en el suministro eléctrico), nunca obtendrá un diario dinámico.

Lo peor que puede pasar es que deba eliminar el diario caliente que queda después de un bloqueo.

+0

Gracias! También quiero saber si el archivo de base de datos (*. Db) seguirá siendo grabable si se produce un corte de energía mientras se escriben algunos cambios en la base de datos. – quantity

+0

@quantity El bloqueo se realiza en el nivel del sistema operativo, por lo que después de una falla repentina y después de reiniciar, el código fschk debe borrar eso y se podrá volver a acceder al archivo.El bloqueo no se realiza cambiando los atributos del archivo. Además, a partir de las referencias de los artículos en la respuesta, está claro que los "diarios calientes" se manejan de forma automática cuando se accede al archivo DB. – Ber

+0

Nunca debe eliminar un archivo de diario caliente. Consulte la documentación oficial: [Cómo corromper un archivo de base de datos SQLite] (http://www.sqlite.org/howtocorrupt.html), sección 1.3. –

1

podría ocurrir cualquier cosa con el apagado repentino. Sin embargo, sugeriría UPS para mitigar cualquier riesgo.

+0

Y todo puede suceder debido a los rayos cósmicos, pero en la práctica, una base de datos sqlite3 generalmente permanecerá constante en caso de una pérdida repentina de energía en sistemas de archivos predecibles. – Arelius

4

Como Sqlite cumple con ACID, una desconexión no debería ser un problema.

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

+0

Me temo que el apagado afectaría las propiedades del archivo y no se abrirá en absoluto o no puedo escribir ningún dato en él. – quantity

+0

@quantity, ¿por qué le tienes miedo? Siempre que no elimine el archivo de diario, sqlite3 debería poder reparar la base de datos en caso de una pérdida repentina de energía. – Arelius

Cuestiones relacionadas