La prevalenza è una tecnica semplice per fornire proprietà ACID a un modello di oggetti in memoria basato su serializzazione binaria e registrazione write-ahead. Funziona così:
- Inizia con un'istantanea. Serializza il modello a oggetti e scrivilo su un file.
- Crea un file journal. Per ogni chiamata nel modello a oggetti, serializza la chiamata e i relativi 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 un blackout, caricare l'ultima istantanea ed eseguire nuovamente tutte le chiamate registrate nel giornale.
Le precauzioni necessarie per farlo funzionare sono:
- Non lasciare che i riferimenti oggetto 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, è stato soprannominato " problema del battesimo ".)
- Tutta la logica raggiungibile da una chiamata deve essere completamente deterministica e non deve eseguire chiamate I / O o OS significative per la logica di business. Scrivere su un log diagnostico è probabilmente OK, ma generalmente non è il tempo di sistema o il lancio di un delegato asincrono. Questo è così che la rivista si ripete in modo identico anche se è stata ripristinata su una macchina diversa o in un altro momento. (Il codice di maggior prevalenza fornisce una chiamata di tempo alternativo per ottenere il timestamp della transazione.)
- La concorrenza del writer introduce ambiguità nell'interpretazione del journal, quindi è vietata.
È perché ...
- le persone hanno sviluppato un cattivo gusto per loro dopo aver provato ad usarne uno su un progetto che non era adatto a * ?
- advocacy stridente di Klaus Wuestefeld ha disattivato le persone ?
- le persone a cui piace il modello di programmazione imperativo non gradiscono separando I / O dal calcolo , preferendo invece interlacciare il calcolo con I / O e chiamate di threading?
- i livelli di prevalenza sono così concettualmente semplici e così intimamente legati alle caratteristiche del framework in cui abitano che vengono solitamente personalizzati per il progetto, il che li rende troppo alieni / non standard / rischiosi?
- è troppo difficile tenere dritti ciò che devi fare attenzione a non fare? I capi di
- neofiti sembrano esplodere di fronte a qualcosa che non è lo stesso tipo di app a due livelli basata su database che hanno imparato a scrivere a scuola? ;)
* Il intero set di dati si adatta alla RAM , non è necessario la concorrenza tra writer e non è necessario eseguire query ad hoc, report o esportazione in un data warehouse. Con scuse a SQLite, la prevalenza è un miglioramento sui file di salvataggio, non una sostituzione per Oracle.