Programmazione:Java/JTA

Da WikiSitech.
Vai alla navigazioneVai alla ricerca

<< Back to Java

Transazioni Java (JTA)

Con transazione si intende una unità logica di elaborazione composta da una sequenza di operazioni che devono terminare tutte con successo o fallimento.
In J2EE esistono 2 tipi di transazioni: quelle gestite direttamente dal container EJB dell'applicazione (Container-managed Transaction) oppure quelle applicative (Bean-managed Transaction). L'approccio CMT, rispetto al secondo approccio, semplifica lo sviluppo e la gestione delle transazioni, poiché tutte le operazioni di begin, commit o rollback verranno svincolate dal codice e delegate al container, utilizzando delle annotazioni Java.
A tal proposito, esistono 6 attributi che specificano il modo in cui la transazione deve essere gestita:

  • Required: è l'attributo implicito per le transazioni di tipo CMT. Il metodo annotato verrà sempre eseguito in transazione. Il container si aggancerà alla transazione del chiamante, se presente, altrimenti ne aprirà una nuova.
  • RequiresNew: il metodo annotato verrà sempre eseguito in una nuova transazione, indipendentemente dalla transazione (eventuale) del chiamante.
  • NotSupported: il metodo annotato verrà sempre eseguito fuori transazione. Il container sospende l'eventuale transazione del chiamante prima di eseguire il metodo annotato. Al completamento di quest'ultimo, il container riprenderà la transazione del chiamante.
  • Supports: il metodo annotato verrà eseguito in transazione o meno a seconda dell'esecuzione (transazionale o meno) del chiamante: se il chiamante esegue in transazione, il container si aggancerà ad essa, altrimenti, al pari del chiamante, il metodo invocato verrà eseguito fuori transazione.
  • Mandatory: il metodo annotato è forzato ad eseguire in transazione. Se il chiamante non è associato ad alcuna transazione, verrà sollevata una TransactionRequiredException.
  • Never: il metodo annotato è forzato ad eseguire fuori transazione. Se il chiamante è in transazione, verrà sollevata una RemoteException.


Dall'uso delle transazioni ne conseguono 2 aspetti, uno funzionale e uno tecnico. Quello funzionale, relativo al rollback delle operazioni, e quello tecnico, relativo alla gestione delle risorse.

Vediamo un esempio, prendendo due metodi generici A e B:

  • A esegue un'operazione di inserimento sulla tabella 'Pippo' e successivamente invoca B.
  • B esegue un'operazione di aggiornamento sulla tabella 'Pluto'.

Caso in cui A esegua in transazione (T1):

  1. Se B è annotato come Required, viene agganciato a T1. Le risorse 'Pippo' e 'Pluto' saranno accessibili solo al termine della transazione T1. Se l'aggiornamento va in errore, verrà eseguito il rollback dell'inserimento, siccome entrambi sono sotto stessa transazione T1.
  2. Se B è annotato come RequiresNew, viene aperta una nuova transazione T2. La tabella 'Pluto' sarà accessibile al termine della transazione T2. La tabella 'Pippo' sarà accessibile al termine della transazione T1. Se l'aggiornamento va in errore, non verrà eseguito il rollback dell'inserimento, siccome operano in transazioni separate.
  3. Se B è annotato come NotSupported, esegue fuori transazione. La tabella 'Pluto' sarà accessibile al termine dell'operazione di aggiornamento. La tabella 'Pippo' sarà accessibile al termine della transazione T1. Se l'aggiornamento va in errore, non verrà eseguito il rollback dell'inserimento, siccome l'aggiornamento è eseguito in ambito non transazionale.
  4. Se B è annotato come Supports, viene agganciato a T1. Le risorse 'Pippo' e 'Pluto' saranno accessibili solo al termine della transazione T1. Se l'aggiornamento va in errore, verrà eseguito il rollback dell'inserimento, siccome entrambi sono sotto stessa transazione T1.
  5. Se B è annotato come Mandatory, viene agganciato a T1. Le risorse 'Pippo' e 'Pluto' saranno accessibili solo al termine della transazione T1. Se l'aggiornamento va in errore, verrà eseguito il rollback dell'inserimento, siccome entrambi sono sotto stessa transazione T1.
  6. Se B è annotato come Never, viene sollevata una RemoteException. Le risorse 'Pippo' e 'Pluto' saranno accessibili. Verrà eseguito il rollback dell'inserimento

Caso in cui A non esegua in transazione:

  1. Se B è annotato come Required, viene aperta una nuova transazione T1. La tabella 'Pippo' sarà accessibile al termine dell'operazione di inserimento. La tabella 'Pluto' sarà accessibile al termine della transazione T1. Se l'aggiornamento va in errore, non verrà eseguito il rollback dell'inserimento, siccome quest'ultimo è eseguito in ambito non transazionale.
  2. Se B è annotato come RequiresNew, viene aperta una nuova transazione T1. La tabella 'Pippo' sarà accessibile al termine dell'operazione di inserimento. La tabella 'Pluto' sarà accessibile al termine della transazione T1. Se l'aggiornamento va in errore, non verrà eseguito il rollback dell'inserimento, siccome quest'ultimo è eseguito in ambito non transazionale.
  3. Se B è annotato come NotSupported, esegue fuori transazione. La tabella 'Pippo' sarà accessibile al termine dell'operazione di inserimento. La tabella 'Pluto' sarà accessibile al termine dell'operazione di aggiornamento. Se l'aggiornamento va in errore, non verrà eseguito il rollback dell'inserimento, siccome le operazioni sono eseguite in ambito non transazionale.
  4. Se B è annotato come Supports, esegue anch'esso fuori transazione. La tabella 'Pippo' sarà accessibile al termine dell'operazione di inserimento. La tabella 'Pluto' sarà accessibile al termine dell'operazione di aggiornamento. Se l'aggiornamento va in errore, non verrà eseguito il rollback dell'inserimento, siccome le operazioni sono eseguite in ambito non transazionale.
  5. Se B è annotato come Mandatory, viene sollevata una TransactionRequiredException. Le risorse 'Pippo' e 'Pluto' saranno accessibili. Non verrà eseguito il rollback dell'inserimento, siccome l'operazione è eseguita in ambito non transazionale.
  6. Se B è annotato come Never, esegue fuori transazione. La tabella 'Pippo' sarà accessibile al termine dell'operazione di inserimento. La tabella 'Pluto' sarà accessibile al termine dell'operazione di aggiornamento. Se l'aggiornamento va in errore, non verrà eseguito il rollback dell'inserimento, siccome le operazioni sono eseguite in ambito non transazionale.