Pregunta

Estoy escribiendo una aplicación sencilla con 24 artículos en un hash que ser persistente en las ejecuciones del programa, por lo que Berkeley DB (DBM) debe ser muy adecuado para esta tarea.

Y es sólo por diversión.

Pero me pregunto si usarlo (con Ruby), a continuación, cuando el usuario presiona CTRL-C, a continuación, la ejecución se detiene. En este caso, no pueden ser los datos hecha un lío?

Por ejemplo, si el valor de DB es 63, y yo incrementarlo en 1 (para ser 64)

63 =  111111 (in binary)  
64 = 1000000 (in binary)

Por lo tanto, podría el CTRL-C producirse justo cuando el "más significativo" 1 está escrito y los 0s pero no se han escrito? En ese caso, el valor en la base de datos será 127 en lugar de 63 o 64. ¿Y si no es Rubí pero en C, y los usos de usuario "Cerrar ventana" o "matar" a matar el proceso? Ahora que pienso en ello, el disco duro, probablemente escribir este byte (o 4 bytes) de la superficie del disco duro a la vez, por lo que esto no debería ocurrir.

Si CTRL-C no hará que esto suceda, a continuación, un corte de energía o yo patear el enchufe puede hacer que esto suceda? Por ejemplo, cuando el valor se almacena en caché por primera vez en la memoria RAM, y mientras se escribe en el disco duro, patear la clavija de alimentación, y el disco duro se queda sin alimentación antes de que los 0s están escritos. Sé que uno en un millón de veces, esto no va a suceder, pero esto es sólo una cuestión de curiosidad.

Por otro lado, si mi script es

  1. Disminuir el valor de la moneda
  2. Dar al usuario una "hamburguesa" en su inventario

a continuación, cuando el usuario presiona CTRL-C, y sucede justo entre (1) y (2) anterior, entonces el usuario tendrá menos de la moneda, y obtener no hamburguesa.

Para evitar todo esto suceda, sería utilizar el método transaccional utilizando SleepyCat, SQLite o MySQL, y ninguno de ellos va a pasar?

¿Fue útil?

Solución

sistema de base de datos de buena No (una categoría que incluye Berkeley DB) podría ser interrumpido en la forma que usted sugiere, con un valor actualizado parcialmente. no cuando se pulsa Ctrl + C se puede interrumpir la CPU mediados de instrucción. Siempre hay un cierto nivel de granularidad a la interrupción, y las bases de datos bien escritos aprovechar este hecho para protegerse contra la base de datos cada vez estar en un estado incoherente.

Existe el potencial para la corrupción y pérdida de datos cuando se va la luz, pero los detalles de si o no datos serían perdidos o dañados tienen más que ver con el sistema de archivos en el que se almacenan los archivos de base de datos. Un buen sistema de ficheros de diario, por ejemplo, escribe lo que va a hacer en un "diario", entonces lo hace, a continuación, escribe en la revista que lo hizo. Así que si se queda sin energía durante una operación de escritura, por ejemplo, se ve en su diario para ver si hay algo que tiene que terminar antes de permitir el acceso al sistema de archivos. Esta es una simplificación excesiva, pero se puede obtener los detalles por el control de ext3 en Wikipedia, por ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top