Domanda di progettazione delle transazioni del database
-
28-10-2019 - |
Domanda
Considera i seguenti due blocchi di Java Psedo-Code in un sistema che utilizza transazioni ottimistiche.
Esempio A.:
try {
txn.begin();
// database operations
txn.commit();
}
catch (Exception e) {
txn.rollback();
}
Esempio b
txn.begin();
// database operations
try {
txn.commit();
}
catch (Exception e) {
txn.rollback();
}
Vedo le transazioni condotte in entrambi i modi nel nostro codice; sono sicuro che UN è corretta. La mia intuizione me lo dice B è sbagliato, ma sembra che non ci siano danni B dal commit()
è nel blocco di prova e può essere catturato e girato in caso di errore. Si prega di spiegare se B è corretto e perché. Grazie!
Modificare: Quindi non sto davvero ottenendo la risposta che sto cercando. io lo so già Quello B è in qualche modo "cattivo", quello che sto cercando è perché è cattivo; Cioè, c'è una possibile situazione in cui UN funzionerebbe dove B fallirebbe?
-tjw
Soluzione
Vorrei fare un leggero mix (esempio c):
txn.begin();
try {
// database operations
txn.commit();
}
catch (Exception e) {
txn.rollback();
}
Tieni i comandi del database nel blocco Try, ma lascia fuori la transazione "inizia". Se si erro l'errore su "Inizia" non proverai a far rotolare una transazione che non è mai stata avviata nel blocco di cattura.
Modificare
La ragione perché L'esempio B è cattivo è perché l'unico modo in cui si fa mai il rollback della tua transazione è se il commit fallisce. Tuttavia, il motivo per cui A è anche negativo è perché hai il piccolo potenziale di fallire quando si inizia una transazione, nel qual caso tenterai di rimpiangere qualcosa che non esiste.
Altri suggerimenti
Bene, in B Non rimpiangeresti la transazione se si verifica un errore prima del commit. Non ti impegni neanche, almeno non in quel pezzo di codice, ma forse più tardi, per caso? Sembra meglio impegnarsi o rollback il più presto possibile e non lasciare la transazione in giro per un po 'di pulizia che si spera si svolge in seguito.
Direbbe che è un problema con B.
Inoltre, a seconda del sistema, potrebbe essere finalmente bisogno anche per disattivare correttamente la transazione.