【问题标题】:XA Datasource does not create a transactionXA 数据源不创建事务
【发布时间】:2015-11-16 18:55:46
【问题描述】:

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

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

如果我在锁定查询周围使用 BEGINCOMMIT 手动创建事务,一切都会按预期进行 - 但我希望 Wildfly 自动为我执行此操作。

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


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

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

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

【问题讨论】:

  • 对于容器管理的事务,WildFly 需要知道事务的范围。我不认为@RequestScoped 会建议任何事务功能。

标签: jakarta-ee jboss transactions wildfly xa


【解决方案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
        ...
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多