There are two JBoss 7.1.1.Final servers. The first one contains BeanA
@Stateless
@Remote(IBeanA.class)
public class BeanA implements IBeanA {
@PersistenceContext
private EntityManager em;
public void test() {
em.createNativeQuery("insert into A(value) values (0)").executeUpdate();
}
}
The second one contains BeanB
@Stateless
@LocalBean
public class BeanB {
@PersistenceContext
private EntityManager em;
public void test() {
em.createNativeQuery("insert into A(value) values(1)").executeUpdate();
try {
Hashtable props = new HashTable();
props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
InitialContext ctx = new InitialContext(props);
IBeanA beanA = (IBeanA) ctx.lookup("ejb:app/ejb/BeanA!IBeanA");
beanA.test();
} catch (NamingException e) {
throw new RuntimeException(e);
}
em.createNativeQuery("insert into A(value) values(2)").executeUpdate();
}
}
After BeanB.test() call there are only two records in the A table with values 1 and 2, so the transaction on server 1 was not committed. It never commits nor rollbacks even if I stop server 1. It's strange but if I wrap remote calls in BeanB into a separate transaction or to a method with no transaction support, all works as expected. I think it's definitely a bug.