Transizione di sqlite da transazioni a salvapoint
-
12-12-2019 - |
Domanda
La mia applicazione basata su SQLite
utilizza attualmente le transazioni - entrambi per essere in grado di rollback e per migliorare le prestazioni.Sto considerando di sostituire tutte le transazioni con SavePoints.Il motivo è che l'applicazione è multi-thread (sì, sqlite
è configurata per essere cabina di thread), e in alcuni casi una transazione potrebbe iniziare da due thread nello stesso tempo (sullo stesso DB).
- .
- c'è una ragione per non farlo?
- Ci sono delle insidie di cui ho bisogno per essere a conoscenza?
- Sostituisco solo
BEGIN
,COMMIT
,ROLLBACK
conSAVEPOINT xyz
,RELEASE SAVEPOINT xyz
,ROLLBACK TO SAVEPOINT xyz
?
Soluzione
It there a reason NOT to do it?
.
Sì. Non risolverà nessuno dei problemi delineati. I punti di salvataggio sono principalmente utilizzati per poter fare rollback parziali di dati. La transazione esterna o Savepoint è ciò che è effettivamente commesso. Nulla è davvero completamente salvato fino a quando non viene rilasciato il salvapoint più esterno aggiornando il DB. Torna indietro allo stesso problema che hai con le transazioni standard.
Are there any pitfalls I need to be aware of?
.
Sì. Transazioni o salviet in un'applicazione multithreading può dedersiare abbastanza facilmente se si aggiorna gli stessi dati in due file diversi che presumo sia il cuore della questione. Non c'è differenza tra i due a questo proposito. Dovresti essere a conoscenza di ciò che stai aggiornando in ogni filettatura e sincronizza di conseguenza.
In breve, a meno che tu non abbia la necessità di fare il rollback della transazione parziale, i salvatori non ti darà molto (diverso dal fatto che vengono nominati.)
Non c'è un proiettile d'argento qui. Sembra che tu sia necessario eseguire analisi gravi della tua applicazione e dei dati che possono essere aggiornati in più thread e aggiungere una certa sincronizzazione in applicazione, se necessario.