我的一个 glassfish 服务器有一个奇怪的问题。看看这段代码:
userTransaction.begin();
MyEntity entity = new MyEntity(12345);
//setting values..
entityManager.persist(entity);
MyEntity persistedEntity = entityManager.createQuery("SELECT p FROM MyEntity p WHERE p.idpk=12345").getSingleResult();
//...
userTransaction.commit(); //OK => the tuple is in the DB
现在出现业务问题,需要回滚事务。
userTransaction.begin();
MyEntity entity = new MyEntity(12345);
//setting values..
entityManager.persist(entity);
MyEntity persistedEntity = entityManager.createQuery("SELECT p FROM MyEntity p WHERE p.idpk=12345").getSingleResult();
//...
//Business problem => rollback
userTransaction.rollback(); //ERROR => the tuple 12345 is in the DB !
即使回滚似乎有效(没有引发异常或奇怪的日志输出),元组已经提交到数据库中......为了搜索问题所在,我尝试了以下代码:
userTransaction.begin();
MyEntity entity = new MyEntity(12345);
//setting values..
entityManager.persist(entity);
//Business problem => rollback
userTransaction.rollback(); //OK => the tuple 12345 is NOT in the DB !
使用此代码(不检索实体),元组不会提交到数据库,这是正确的行为。让我们更进一步:
userTransaction.begin();
MyEntity entity = new MyEntity(12345);
//setting values..
entityManager.persist(entity);
MyEntity persisted = entityManager.find(MyEntity.class, 12345);
//...
//Business problem => rollback
userTransaction.rollback(); //OK => the tuple 12345 is NOT in DB
在最后一种情况下,结果仍然正确,并且没有提交给数据库的元组。似乎 EntityManager 在使用查询检索实体时做了一个神奇的 [不需要的] 提交......我还尝试在另一个表上进行查询,这不会导致错误的提交(回滚有效)。此外,我尝试在自己的服务器上重现该问题,并且没有问题:所有回滚都正常工作。因此,它确实应该是服务器配置问题。
有关信息,它是在 linux 上运行的 glassfish v2.1.1。EntityManager 在 FlushModeType.AUTO 中。
有人有想法吗?
谢谢和最好的问候!