2015-11-16 5 views
0

У меня есть источник данных XA Datasource в Wildfly 8.2. Это все работает нормально, но когда я называю:XA Datasource не создает транзакции

sql.query("LOCK TABLE table_name IN EXCLUSIVE MODE").execute(); 

я получаю исключение, показывая, что Wildfly имеет не создал сделки:

org.postgresql.util.PSQLException: ERROR: LOCK TABLE can only be used in transaction blocks

Если я вручную создать транзакцию с BEGIN и COMMIT вокруг моего запроса блокировки, все работает так, как ожидалось, но я бы хотел, чтобы Wildfly сделал это для меня автоматически.

Почему Wildfly не создает транзакцию автоматически и что мне нужно сделать, чтобы исправить ее?


Для справки, код вызывается в методе, как:

@RequestScoped 
@Path("abc") 
public class Controller { 

@PUT 
public Response m(Object data) { 
    //HERE 
} 
+1

Для управляемых контейнером транзакций WildFly должен знать объем сделки. Я не думаю, что @RequestScoped будет сообщать о любых транзакционных возможностях. – johan

ответ

1

Если вы хотите wildfly создать транзакцию для вас, использовать EJB боб .. Для примера, инжекции @ Сеанс сеанса без состояния должен работать (поскольку вы используете RequestScoped, а сеансовые компоненты без состояния имеют аналогичный жизненный цикл)

По умолчанию каждый метод неактивного ejb создаст для вас транзакцию или если у клиента уже есть текущая транзакция , он будет использовать его.

Пример кода:

@RequestScoped 
@Path("abc") 
public class Controller { 

    @EJB 
    private YourStatelessEJB statelessBean; 

    @PUT 
    public Response m(Object data) { 
     //HERE 
     statelessBean.doSomething(data) 
} 

@Stateless 
@LocalBean 
public class YourStatelessEJB { 

    @PersistenceContext 
    private EntityManager em; 

    public YourStatelessEJB() { 

    } 

    public void doSomething(Object data) { 
     // here you already have a transaction, created by the ejbcontainer 
     ... 
    } 

} 
Смежные вопросы