XA Datasource 不创建事务
XA Datasource does not create a transaction
我在 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
如果我在锁定查询周围使用 BEGIN
和 COMMIT
手动创建事务,一切都会按预期进行 - 但我希望 Wildfly 自动为我执行此操作。
为什么 Wildfly 不自动创建交易,我需要做什么来解决它?
供参考,代码在如下方法中调用:
@RequestScoped
@Path("abc")
public class Controller {
@PUT
public Response m(Object data) {
//HERE
}
如果您希望 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
...
}
}
我在 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
如果我在锁定查询周围使用 BEGIN
和 COMMIT
手动创建事务,一切都会按预期进行 - 但我希望 Wildfly 自动为我执行此操作。
为什么 Wildfly 不自动创建交易,我需要做什么来解决它?
供参考,代码在如下方法中调用:
@RequestScoped
@Path("abc")
public class Controller {
@PUT
public Response m(Object data) {
//HERE
}
如果您希望 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
...
}
}