Qualcuno ha esperienza che può condividere usando MySQL savepoints (direttamente o tramite un ORM), specialmente in un servizio web non banale? Dove li hai effettivamente usati? Sono abbastanza affidabili (supponendo che tu sia disposto a eseguire una versione abbastanza recente di MySQL) o troppo dispendioso o costoso?Utilizzi reali dei punti di salvataggio MySQL nei servizi Web?
Infine, qualcuno ha esperienza con qualcosa come il seguente caso d'uso e hai usato punti di salvataggio per questo? Dire che il punto principale di alcune unità di lavoro specifiche è aggiungere una riga a una tabella Orders
(o qualsiasi altra cosa, non deve essere correlata all'ordine, ovviamente) e aggiornare una tabella OrdersAuditInfo
, nella stessa transazione. È essenziale aggiornare Orders
se possibile, ma la tabella OrdersAuditInfo
non è essenziale (ad esempio, è sufficiente registrare un errore in un file, ma continuare con la transazione generale). Ad un livello basso che potrebbe assomigliare a questo (attenzione, segue pseudo-SQL):
BEGIN;
INSERT INTO Orders(...) VALUES (...);
/* Do stuff outside of SQL here; if there are problems, do a
ROLLBACK and report an error (i.e., Order is invalid in this
case anyway). */
SAVEPOINT InsertAudit;
INSERT INTO OrdersAudit(...) VALUES(...);
/* If the INSERT fails, log an error to a log file somewhere and do: */
ROLLBACK TO SAVEPOINT InsertAudit;
/* Always want to commit the INSERT INTO Orders: */
COMMIT;
Ma anche qui forse ci sarebbe una migliore (o almeno più comune) idioma? Si potrebbe fare l'inserto OrdersAuditInfo
in una transazione completamente diversa, ma sarebbe bello garantire che il tavolo OrdersAuditInfo
fosse non scritto a meno che l'ultimo COMMIT
funzionasse effettivamente.
Il motivo per cui desideravo che OrderAudit facesse parte della transazione globale era nel caso in cui l'inserimento in ordini non fosse riuscito in fase di COMMIT per qualche motivo. –