2016-07-29 8 views
0

Ich habe den folgenden Code:EJB 3-Transaktion Rollback-Ausgabe

 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
     public Car prepareCar(Data data) throws CarServiceException{ 
      Car car = null; 
      try { 
      car = carManagerBean.createCar(data); 
      Driver driver = createDriver(); 
      car.setDriver(driver); 
      } catch (Exception e) { 
      LOGGER.error(e.getMessage, e); 
      context.setRollbackOnly(); 
      throw new CarServiceException(e); 
      } 
      return car; 
     } 

Das Problem ist, dass, wenn einige Probleme in Versuch Abschnitt erscheinen (zum Beispiel SQLServerException) Rastabschnitt nicht ausgeführt wird und CarServiceException nicht geworfen. Weiß jemand, was das Problem mit diesem Code sein könnte? Aber die Transaktion wird trotzdem zurückgesetzt. Es funktioniert nur, wenn ich try-catch-Block verschiebe, um den Methodenaufruf zu umbrechen.

Antwort

0

Denken Sie daran, dass wenn Ihr catch-Block selbst eine Ausnahme auslöst, er nicht zu dem Segment gelangt, das die Ausnahme erneut auslöst. Beachten Sie, dass gemäß der Dokumentation setRollbackOnly() eine IllegalStateException auslösen kann, wenn die Transaktion nicht mehr aktiv ist. Sie könnten den Block catch in einen anderen Block try/catch einbinden, um dies herauszufinden.

+0

Es führt nicht einmal die erste Zeile aus catch-Block: 'LOGGER.error (e.getMessage, e);' – romanvintonyak

+0

Das ist nicht möglich, es sei denn, der Code wirft keine Ausnahme. Versuchen Sie, einen Debug-Protokolleintrag am Ende des try-Blocks einzufügen. –

1

Sie möchten die Ausnahme außerhalb der Transaktion abfangen. Tun Sie dies:

@Stateless 
public class CarServiceDelegate { 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public Car prepareCar(Data data) throws CarServiceException{ 
     Car car = carManagerBean.createCar(data); 
     Driver driver = createDriver(); 
     car.setDriver(driver); 
     return car; 
    } 
} 

public class CarService { 

    @EJB 
    private CarServiceDelegate carServiceDelegate; 

    public Car prepareCar(Data data) { 
     try { 
      return carServiceDelegate.prepareCar(); 
     } catch (Exception e) { 
     // You will catch it here, when the transaction is done. 
     LOGGER.error(e.getMessage, e); 
     throw new CarServiceException(e); 
     } 
    } 

} 

Ich gebe Ihnen ein Update darüber, welcher Teil der ejb Ausnahme die Ausbreitung der Ausnahme außerhalb der Transaktion beauftragt. Ein ähnliches Verhalten tritt auf (wobei die Ausnahme unterdrückt wird) in einem @Asynchronous Aufruf.

+0

Wie wird die Transaktion im Fehlerfall zurückgesetzt? – romanvintonyak

+0

Es wird automatisch ein Rollback gemäß der EJB-Spezifikation durchgeführt, wenn eine Ausnahme auftritt (es sei denn, es handelt sich um eine ApplicationException mit rollback = false), wird die Transaktion zurückgesetzt. – maress

+0

Anwendungsausnahmen sind standardmäßig rollback = false gemäß der Spezifikation, frühere EJB-Spezifikationen unterscheiden zwischen Runtime und aktivierten Ausnahmen. Jede RuntimeException markiert das Tx als Rollback, eine markierte Exception markiert es nicht und Sie müssen setRollbackOnly in Ihrem Anwendungscode aufrufen. – wfink