Question

Je suis en train d'écrire une application simple avec 24 éléments dans un hachage pour être persistant dans les exécutions du programme, de sorte que Berkeley DB (DBM) doit être bien adapté à cette tâche.

Et il est juste pour le plaisir.

Mais je me demande si vous l'utilisez (avec Ruby), puis lorsque l'utilisateur appuie sur CTRL-C, l'exécution est arrêté. Dans ce cas, ne peut pas être données tout foiré?

Par exemple, si la valeur de DB est 63, et j'incrémentation par 1 (à 64)

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

, pourrait la produire CTRL-C à droite lorsque le « plus important » 1 est écrit et mais les 0s n'a pas été écrit? Dans ce cas, la valeur de la base de données sera 127 au lieu de 63 ou 64. Et si ce n'est pas Ruby mais en C, et l'utilisateur utilise « Fermer la fenêtre » ou « tuer » pour tuer le processus? Venez y penser, le disque dur écrire probablement cet octet (ou 4 octets) à la surface du disque dur à la fois, donc cela ne devrait pas se produire.

si CTRL-C ne causera pas que cela se produise, puis une panne de courant ou moi-même avoir tapé dans le cordon d'alimentation pourrait causer cela se produise? Par exemple, lorsque la valeur est d'abord mis en mémoire cache dans la mémoire vive, et alors qu'il est écrit sur le disque dur, je botter le cordon d'alimentation, et le disque dur perd de la puissance avant que les 0s sont écrits. Je sais que l'un dans un million de fois, cela ne se produira pas, mais cela est juste une question de curiosité.

Par contre, si mon script est de

  1. décrémenter la valeur de la pièce
  2. Donner à l'utilisateur un dans son inventaire "hamburger"

puis lorsque l'utilisateur appuie sur CTRL-C, et il arrive juste entre (1) et (2) ci-dessus, l'utilisateur aura moins pièce, et d'obtenir aucun hamburger.

Pour éviter tout cela se produise, il serait d'utiliser la méthode transactionnelle à l'aide Sleepycat, SQLite ou MySQL, et aucun de ceux-ci se produira?

Était-ce utile?

La solution

Pas bon système de base de données (une catégorie qui comprend Berkley DB) pourrait être interrompu de la manière que vous proposez, avec une valeur partiellement mise à jour. Lorsque vous appuyez sur Ctrl-c vous ne pouvez pas interrompre la mi-instruction du processeur. Il y a toujours un certain niveau de granularité à l'interruption, et les bases de données bien écrit tirer parti de ce fait pour se prémunir contre la base de données jamais être dans un état incohérent.

Le risque de corruption de données et la perte existe lorsque la panne de courant, mais les détails si oui ou non les données seraient perdues ou corrompues ont plus à voir avec le système de fichiers sur lequel les fichiers de base de données sont stockés. Un bon système de fichiers journalisé, par exemple, écrit ce qu'il va faire dans un « journal » fait alors il, écrit alors dans le journal qu'il l'a fait. Donc, si elle perd le pouvoir au cours d'une opération d'écriture, par exemple, il regarde son journal pour voir s'il y a quelque chose dont il a besoin pour terminer avant d'autoriser l'accès au système de fichiers. Ceci est une simplification, mais vous pouvez obtenir les détails en consultant ext3 sur wikipedia, par exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top