cannot commit with autocommit set ???
elkner Jan 26, 2006 10:37 PMHmmm, since it seems to be impossible to persist and remove an entity within the same JTA, I 'm trying to manage the tx manually, i.e. with tx1 persist and within tx2 cleanup aka remove:
SLSB
...
@PersistenceUnit(unitName="foo")
EntityManagerFactory emf;
EntityManager em;
@PostConstruct
public void init() {
// emf = Persistence.createEntityManagerFactory("foo");
em = emf.createEntityManager();
}
@PreDestroy
public void destroy() {
if (em.isOpen()) {
em.close();
}
// if (emf.isOpen()) {
// emf.close();
// }
}
...
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public Catalog importCatalog(CatalogImportProfile profile,
byte[] data, String clientId)
{
Catalog catalog = null;
em.getTransaction().begin();
try {
mergeCatalog(profile, data);
catalog = profile.getCatalog();
em.getTransaction().commit(); // line 126 of CatalogImportSB
} catch (Exception e) {
log.warn(e.getLocalizedMessage());
em.getTransaction().rollback();
return null;
}
if (profile.isEnabled(Option.G_DELETE_EMPTY)) {
em.getTransaction().begin();
try {
removeEmptyGroups(profile.getCatalog().getId());
em.getTransaction().commit();
} catch (Exception e) {
log.warn(e.getLocalizedMessage());
em.getTransaction().rollback();
}
}
return catalog;
}
However, in this case I get:
2006-01-27 03:22:45,874 ERROR [SocketServerInvokerThread-192.168.21.1-350:org.hibernate.transaction.JDBCTransaction:124] - JDBC commit failed
java.sql.SQLException: You cannot commit with autocommit set!
at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java:434)
at org.jboss.resource.adapter.jdbc.WrappedConnection.commit(WrappedConnection.java:331)
at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:139)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:115)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:36)
at foo.CatalogImportSB.importCatalog(CatalogImportSB.java:126)
1) The ds file for mySQL uses the "maxPerformance" config parameter, so there the "autocommit" is definitly set to false. So where the hell is the "autocommit" set?
2) If I use emf.getEntityManager() in @PostConstruct, the #importCatalog always fails with "no transaction in progress". Reading the spec p.114 pfd I would assume, em.getTransaction().begin starts a new transaction and thus it should not fail. OK p.111 says, the ctx might be tx managed by the PersistenceProvider (in a SE! env) making #getEntityManager() completely wishywashy [useless aka unreliable?] (in this case #getTransaction() doesn't mak any sense to me).
3) If I ommit the @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) on
#importCatalog, the em.getTransaction().commit(); fails with:
2006-01-27 04:02:29,073 ERROR [SocketServerInvokerThread-192.168.21.1-351:org.hibernate.transaction.JDBCTransaction:124] - JDBC commit failed
java.sql.SQLException: You cannot commit during a managed transaction!
at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java:432)
at org.jboss.resource.adapter.jdbc.WrappedConnection.commit(WrappedConnection.java:331)
Why? I actually want to end the tx and commit all changes, and since tx.commit() || tx.rollback() are the only ways to get a tx correctly finished ...
Or does JBoss nest the #importCatalog automatically into another JTA? If so, why (I have not asked for that and - at least I assume - that 've created a tx before using any em method)?
So the only workaround, that I've found for the "persist and remove bug" is to create a complete new em Factory and than a new em (i.e. not using an injected em factory).
But I can't imagine, that this should be really the intended way for solving that issue. So, is someone able to comment on this,/ enlighten me, whether I got something wrong (or the spec is flawed, etc.)? Or is it simply, that JBoss 4.0.3SP1 does not follow the PFD yet?