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).

    .
  1. c'è una ragione per non farlo?
  2. Ci sono delle insidie di cui ho bisogno per essere a conoscenza?
  3. Sostituisco solo BEGIN, COMMIT, ROLLBACK con SAVEPOINT xyz, RELEASE SAVEPOINT xyz, ROLLBACK TO SAVEPOINT xyz?
È stato utile?

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.

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