XA数据源不会创建事务

时间:2015-11-16 18:55:46

标签: java-ee jboss transactions wildfly xa

我在Wildfly 8.2中设置了XA数据源。一切正常,但是当我打电话时:

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

我收到一个异常,显示Wildfly已经创建了一个事务:

  

org.postgresql.util.PSQLException:错误:LOCK TABLE只能在事务块中使用

如果我在锁定查询周围手动创建BEGINCOMMIT的交易,一切都按预期工作 - 但我希望Wildfly能够自动为我做这件事。

为什么Wildfly不会自动创建事务,我需要做些什么来修复它?

作为参考,代码在如下方法中调用:

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

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

1 个答案:

答案 0 :(得分:1)

如果您希望wildfly为您创建事务,请使用ejb bean。对于您的示例,注入@Stateless会话bean应该有效(因为您使用的是RequestScoped,无状态会话bean具有类似的生命周期)

默认情况下,无状态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
        ...
    }

}