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

È stato utile?

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.

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