我在Wildfly 8.2中设置了XA数据源。一切正常,但是当我打电话时:
sql.query("LOCK TABLE table_name IN EXCLUSIVE MODE").execute();
我收到一个异常,显示Wildfly已经不创建了一个事务:
org.postgresql.util.PSQLException:错误:LOCK TABLE只能在事务块中使用
如果我在锁定查询周围手动创建BEGIN
和COMMIT
的交易,一切都按预期工作 - 但我希望Wildfly能够自动为我做这件事。
为什么Wildfly不会自动创建事务,我需要做些什么来修复它?
作为参考,代码在如下方法中调用:
@RequestScoped
@Path("abc")
public class Controller {
@PUT
public Response m(Object data) {
//HERE
}
答案 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
...
}
}