Reputation: 328598
I have an XA Datasource setup in Wildfly 8.2. It all works fine but when I call:
sql.query("LOCK TABLE table_name IN EXCLUSIVE MODE").execute();
I get an exception showing that Wildfly has not created a transaction:
org.postgresql.util.PSQLException: ERROR: LOCK TABLE can only be used in transaction blocks
If I manually create the transaction with a BEGIN
and a COMMIT
around my lock query, everything works as expected - but I would like Wildfly to do that for me automatically.
Why doesn't Wildfly create a transaction automatically and what do I need to do to fix it?
For reference, the code is called in a method like:
@RequestScoped
@Path("abc")
public class Controller {
@PUT
public Response m(Object data) {
//HERE
}
Upvotes: 0
Views: 186
Reputation: 3500
If you want wildfly to create a transaction for you, use a ejb bean.. For your example, injecting a @Stateless session bean should work (since you are using RequestScoped, and stateless session beans have a similar lifecycle)
By default, each method of the stateless ejb will create a transaction for you, or if the client already has a current transaction, it will use it.
Code example:
@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
...
}
}
Upvotes: 1