Domanda

Sto scrivendo una semplice app con 24 elementi in un hash per essere persistente tra le esecuzioni del programma, quindi Berkeley DB (DBM) dovrebbe essere adatto a questa attività.

Ed è solo per divertimento.

Ma mi chiedo se lo si utilizza (con Ruby), quando l'utente preme CTRL-C, l'esecuzione viene interrotta.In questo caso, i dati non potrebbero essere tutti incasinati?

Ad esempio, se il valore nel DB è 63 e lo incremento di 1 (per essere 64)

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

quindi, il CTRL-C potrebbe verificarsi proprio quando viene scritto l'1 "più significativo" e ma gli 0 non sono stati scritti?In tal caso il valore nel DB sarà 127 anziché 63 o 64.Cosa succede se non è Ruby ma in C e l'utente utilizza "chiudi finestra" o "uccidi" per terminare il processo?Ora che ci pensiamo, il disco rigido probabilmente scrive questo byte (o 4 byte) sulla superficie del disco rigido tutto in una volta, quindi ciò non dovrebbe accadere.

se CTRL-C non fa sì che ciò accada, allora un'interruzione di corrente o io stesso che prendo a calci la spina di alimentazione potrebbero causare ciò?Ad esempio, quando il valore viene memorizzato per la prima volta nella cache della RAM e mentre viene scritto sul disco rigido, stacco la spina di alimentazione e il disco rigido perde energia prima che vengano scritti gli 0.Lo so, una volta su un milione, questo non accadrà, ma è solo una questione di curiosità.

D'altra parte, se la mia sceneggiatura è quella

  1. Diminuire il valore della moneta
  2. Dai all'utente un "hamburger" nel suo inventario

quindi quando l'utente preme CTRL-C, e ciò accade proprio tra (1) e (2) sopra, l'utente avrà meno monete e non riceverà hamburger.

Per evitare che tutto ciò accada, sarebbe necessario utilizzare il metodo transazionale utilizzando SleepyCat, SQLite o MySQL e non accadrà nulla di tutto ciò?

È stato utile?

Soluzione

Nessun buon sistema di database (una categoria che include Berkley DB) potrebbe essere interrotto nel modo suggerito da te, con un valore parzialmente aggiornato.Quando premi control-c non puoi interrompere la CPU nel corso dell'istruzione.C'è sempre un certo livello di granularità nell'interruzione e i database ben scritti sfruttano questo fatto per evitare che il database si trovi in ​​uno stato incoerente.

Il rischio di danneggiamento e perdita dei dati esiste quando si interrompe la corrente, ma i dettagli sulla perdita o il danneggiamento dei dati hanno più a che fare con il filesystem su cui sono archiviati i file del database.Un buon filesystem con journaling, ad esempio, scrive cosa farà in un "journal", poi lo fa, quindi scrive nel journal che lo ha fatto.Quindi, se perde potenza durante un'operazione di scrittura, ad esempio, controlla il suo journal per vedere se c'è qualcosa che deve finire prima di consentire l'accesso al filesystem.Questa è una semplificazione eccessiva, ma puoi ottenere i dettagli controllando ext3 su Wikipedia, ad esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top