La prevalenza è una tecnica semplice per fornire proprietà ACID a un modello a oggetti in memoria basato sulla serializzazione binaria e sulla registrazione write-ahead. Funziona così:
- Inizia con un'istantanea. Serializza il modello a oggetti e scrivilo in un file.
- Crea un file journal. Per ogni chiamata nel modello a oggetti, serializzare la chiamata e i suoi argomenti.
- Quando il diario diventa troppo grande, stai chiudendo, o è altrimenti conveniente, esegui un checkpoint: scrivi una nuova istantanea e tronca il diario.
- Per eseguire il rollback o il ripristino da un arresto anomalo o da un colpo di potenza, caricare l'ultima istantanea e rieseguire tutte le chiamate registrate nel diario.
Le precauzioni necessarie per far funzionare questo sono:
- Non lasciare che riferimenti a oggetti mutabili sfuggano o entrino nel livello di prevalenza. Hai bisogno di una sorta di proxy o schema OID, come se stessi facendo RPC. (Questo è un errore da principiante così comune che è stato soprannominato il " problema del battesimo ".)
- Tutta la logica raggiungibile da una chiamata deve essere completamente deterministica e non deve eseguire chiamate di I / O o OS significative dalla logica aziendale. Scrivere su un registro diagnostico è probabilmente OK, ma in genere non è ottenere l'ora di sistema o avviare un delegato asincrono. In questo modo il journal viene riprodotto in modo identico anche se viene ripristinato su una macchina diversa o in un momento diverso. (La maggior parte del codice di prevalenza fornisce una chiamata oraria alternativa per ottenere il timestamp della transazione.)
- La concorrenza degli scrittori introduce ambiguità nell'interpretazione del diario, quindi è vietata.
È perché ...
- le persone hanno sviluppato un cattivo gusto per loro dopo aver provato a usarne uno in un progetto che non era adatto * ad esso?
- La strana difesa di Klaus Wuestefeld ha spento le persone ?
- le persone a cui piace il modello di programmazione imperativa non amano separare l'I / O dal calcolo , preferendo invece intercalare il calcolo con l'I / O e il threading delle chiamate?
- i livelli di prevalenza sono concettualmente così semplici e così intimamente legati alle caratteristiche del quadro in cui abitano che di solito sono personalizzati per il progetto, il che li rende troppo estranei / non standard / rischiosi?
- è troppo difficile tenere dritto quello che devi fare attenzione a non fare?
- Le teste dei neofiti sembrano esplodere di fronte a qualcosa che non è lo stesso tipo di app basata su database a due livelli che hanno imparato a scrivere a scuola? ;)
* L' intero set di dati si adatta alla RAM , non è necessaria la concorrenza degli scrittori e non è necessario eseguire query, rapporti o esportazioni ad hoc in un data warehouse. Con scuse a SQLite, la prevalenza è un miglioramento dei file di salvataggio, non una sostituzione per Oracle.