# ejb: Transaktion rollback



## ratnalein (19. Sep 2014)

Hallo zusammen,

ich habe gerade Schwierigkeit, mein Verständis zu Transaktion Management zu vollenden:


```
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class EmployeeDetailBean implements EmployeeDetailLocal {

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void createEmployeeDetail() {
             System.out.println("creating Employee Detail: ");
             ...
    }
}
```


```
@Stateless
public class EmployeeBean implements EmployeeLocal {

    @EJB
    private EmployeeDetailLocal employeeDetailBean;

    public void createEmployee() {
        // Create employee here
        employeeDetailBean.createEmployeeDetail();
        int zaehler = 5;
        int nenner = 0;
        int ergebnis = zaehler/nenner;
    }
}
```

Wie man sieht, in der Bean-Methode createEmployee() wird die Methode einer anderen Bean aufgerufen(mit der Transaktionsattribute REQUIRED).  

Da in der Methode createEmploye() ja eine Arithmetic-Exception kommt, soll alles was DAVOR passierte, ZURÜCKGEROLLT werden.  Somit wird die Methode createEmployeeDetail(), was zuvor bereits ausgeführt wurde, zurückgerollt.   

Meine Frage:
Wie entscheidet der Container, WAS zurückgerollt wird und WAS nicht?  Denn: offensichtlich wird die Anweisung:

```
System.out.println("creating Employee Detail: ");
```
ja weiterhin ausgeführt.  

Ich vermute:  Was zurückgerollt wird, entscheidet sich dadurch, ob dieses Etwas eine Transaktion braucht oder nicht.  Falls all die Anweisungen KEINE Transaktion brauchen, werden sie auch NICHT zurückgerollt.  System.out.println ist ein Beispiel, dies kann ja unmöglich zurückgerollt werden.

Liege ich mit diesem Verständnis eigentlich richtig?

Vielen Dank.

Viele Grüße aus Rheinland,

Eure Ratna


----------



## Felli (30. Okt 2014)

Hallo,

das Zurückrollen bezieht sich nicht auf einfache Anweisungen, sondern auf andere Ressourcen, die innerhalb einer Transaktion angesprochen werden (zumeist auf Datenbanken). Sollte beispielsweise innerhalb der Methode createEmployeeDetail irgendetwas an eine Datenbank geschrieben werden (EntityManager.persist, EntityManager.merge,...), so stellt die Transaktion sicher, dass dies auch nur ausgeführt wird, wenn keine Ausnahme auftritt.


----------

