2012-03-12 17 views
5

L'applicazione basata su SQLite attualmente utilizza transazioni, sia per poter eseguire il rollback che per migliorare le prestazioni. Sto considerando di sostituire tutte le transazioni con i punti di salvataggio. Il motivo è che l'applicazione è multi-thread (sì, sqlite è configurato per essere thread-safe), e in alcuni casi una transazione potrebbe essere avviata da due thread nello stesso tempo (sullo stesso db).transizione di sqlite dalle transazioni ai punti di salvataggio

  1. C'è un motivo per non farlo?
  2. Ci sono delle insidie ​​di cui ho bisogno di essere a conoscenza?
  3. Posso solo sostituire BEGIN, COMMIT, ROLLBACK con SAVEPOINT xyz, RELEASE SAVEPOINT xyz, ROLLBACK TO SAVEPOINT xyz?
+1

Ho usato _savepoints all'interno di una transazione per implementare transazioni nidificate_ ma ** ciò che suggerisci è una sciocchezza **. i punti di salvataggio non funzionano in questo modo. –

risposta

7
It there a reason NOT to do it? 

Sì. Non risolverà nessuno dei problemi che hai delineato. I punti di salvataggio vengono principalmente utilizzati per eseguire rollback di dati parziali. La transazione esterna o il punto di salvataggio è ciò che viene effettivamente commesso. Nulla è salvato completamente fino a quando non viene rilasciato quel punto di salvataggio più esterno, aggiornando così il DB. Stai tornando indietro allo stesso problema che hai con le transazioni standard.

Are there any pitfalls I need to be aware of? 

Sì. Transazioni o punti di salvataggio in un'applicazione multithread possono deadlock abbastanza facilmente se si aggiornano gli stessi dati in due thread diversi che presumo sia il nocciolo della questione. Non c'è differenza tra i due in questo senso. È necessario essere consapevoli di ciò che si aggiorna in ogni thread e sincronizzare di conseguenza.

In breve, se non si ha la necessità di fare parziali rollback della transazione, i punti di salvataggio davvero wont darà molto (a parte il fatto che essi sono chiamati.)

Non c'è pallottola d'argento qui. Sembra che tu abbia bisogno di fare un'analisi seria della tua applicazione e dei dati che possono essere aggiornati in più thread e aggiungere qualche sincronizzazione nella tua applicazione, se necessario.

+1

Grazie! Sapevo che mi mancava qualcosa :-) – noamtm

Problemi correlati