Sto cercando un modello di codice generico per gestire correttamente la transazione rispetto alla possibile eccezione. Presumo che ci sia un modello di codice comune per questo, indipendentemente dal tipo concreto di transazione con cui stiamo trattando.Qual è il modello di codice corretto per finalizzare le transazioni in Java (rollback su eccezione e commit in caso di successo)?
Ho un metodo che esegue qualcosa nella transazione e desidera rilanciare l'eccezione che può verificarsi quando si trova all'interno del blocco di codice transazionale. Ecco un esempio di tale metodo:
protected void doIt() {
// for JDBC connection transaction may be started automatically
// but assume we start it here
Tran tran = session.beginTran();
try {
// here comes code that does some processing
// modifies some data in transaction
// etc.
// success - so commit
tran.commit();
} catch (Exception ex) { // many different exceptions may be thrown
// subclass of RuntimeException, SQLException etc.
// error - so rollback
tran.rollback();
// now rethrow ex
throw ex; // this line causes trouble, see description below
}
}
ora - c'è compilazione errore nel metodo doIt
. Deve dichiarare throws Exception
ma questo non è accettabile perché il metodo doIt
viene utilizzato in molti posti e l'aggiunta di throws Exception
porta a successive modifiche in luoghi di utilizzo diretto e indiretto di doIt
. È a causa del noto problema di progettazione della lingua Java con le eccezioni dichiarate.
Ora la domanda: come cambiare eccezione vs transazione che gestisce il codice per raggiungere il mio obiettivo - gestire correttamente transazione finalizzazione (eseguire commit o rollback in base alla condizione di successo) e rigenerare esattamente la stessa eccezione che può essere catturato nel codice transazionale bloccare.
So che potrei fare qualcosa come throw new RuntimeException(ex)
ma questo genera un'eccezione di altra classe e voglio evitare tale soluzione.
Avrete bisogno di essere a conoscenza della concorrenza - quasi tutti i sistemi transazionali sembrano finire per essere usati in un contesto concorrente, e questo codice non sembra difendere particolarmente bene ... –
questo è un grande soluzione. – jspcal
@Alex: che cosa ha a che fare con la concorrenza? Cosa c'è di sbagliato in questo codice considerando la concorrenza? Come "difendere"? Potresti spiegare per favore? – WildWezyr