JPA Toplink - какова необходимость проверки активной транзакции в начале процесса?


Я видел несколько примеров в интернете, которые проверяют, активна ли транзакция в данный момент в начале процесса.

Код, ниже которого находится мой get EntityManager от фабрики.

Я не могу понять зачем нужно проверять, активна ли транзакция, прежде чем она даже начнется() ???

Это потому, что какой-то другой процесс может использовать тот же экземпляр EntityManager? (EntityManagerFactory-это синглтон, но EntityManager-это не)

    @Path("update")
    @PUT
    @Consumes("application/json")
    public Response machineUpdate(String content) {
        JSONObject jObj = null;
        EntityManager em = null;
        EntityTransaction txn = null;

        try {

           JSONObject jObj = new JSONObject(content);
           em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();

           //what's this line doing here???
           if(em.getTransaction().isActive()) {
               return HttpStatusHandler.sendConflict();
           }

           txn = em.getTransaction();
           txn.begin();
          //more process ......
        }
        catch(.....
1 2

1 ответ:

Я не вижу никакой причины для проверки транзакции, учитывая, что код использует API транзакций JPA, нет никакого способа для транзакции быть активной, учитывая, что EntityManager был только что создан.

Если вы используете управляемый EntityManager JTA, то транзакция JTA уже может быть активна. Но для JTA вы не можете начать транзакцию с помощью транзакции JPA, вы должны были бы начать транзакцию с JTA или использовать joinTransaction () в JPA.