[英]Java / EJB 3.0 CMT / JTA / MySQL / Hibernate - Transaction not rolling back
我对EJB CMT失去了理智,大约一个星期了,找不到解决方案! 任何启发将不胜感激...
我只是想创建一个CMT EJB,执行一些成功的数据库操作,而最后一个失败(SQLException)。 我希望回滚所有操作,但不会发生...。
我的环境:
我的EJB:
@Stateless(name = "UpdaterFacade", mappedName = "ejb/UpdaterFacade")
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@Interceptors(DefaultFacadeInterceptor.class)
public class UpdaterFacade implements UpdaterFacadeRemote {
@Resource
private EJBContext context;
@PersistenceContext(name = "EJB3DS")
private EntityManager em;
@Override
public void updatePluginDatabase() throws Exception {
try {
em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '0' WHERE `property` = 'CMTTest';").executeUpdate();
em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '1' WHERE `property` = 'CMTTest';").executeUpdate();
em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '2' WHERE `property` = 'CMTTest';").executeUpdate();
em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '3' WHERE `property` = 'CMTTest';").executeUpdate();
em.createNativeQuery("ALTER TABLE `itemprices` DROP FOREIGN KEY `fk_itemprices_itemcodes1`;").executeUpdate();
em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '4' WHERE `property` = 'CMTTest';").executeUpdate();
em.createNativeQuery("RENAME TABLE `foo` TO `noo`;").executeUpdate();
} catch (Exception e) {
// throw new DatabaseCriticalException("ERP_000048", null, e);
context.setRollbackOnly();
}
}
}
除了我尝试重命名表'foo'的最后一行(不存在)外,代码均成功执行。 因此,注入,SQL连接,数据库都可以正常工作(可能配置错误)。
我注意到在逐行调试(并与另一个程序逐行查询数据库)时,在表中的“ DROP FOREIGN”语句之前没有任何更改,之后,提交了先前的语句(对于其他连接/程序可见) 。 在方法结束之前!
当EJB返回时,我的“ CMTTest”属性值为'8',并且我的FOREING KEY被删除,RolledBack没有任何内容... = \\
我已经尝试过使用“ @ApplicationException(rollback = true)”引发异常,后来我更改为显式调用“ setRollbackOnly()”,但没有任何效果……实际上我不认为这是问题所在,否则不会有任何结果在EJB结束之前提交。 我不知何故配置失败。 也许在CMT上进行某种自动提交? 看起来绝望的疯子...
我的persistence.xml
<persistence-unit name="EJB3DS" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/ERPDS</jta-data-source>
<jar-file>CoreClient.jar</jar-file>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
我的GlassFish池配置为:
编辑JDBC连接池
编辑JDBC连接池高级属性
编辑JDBC连接池属性
不知道还有什么要说的重要! 在此先感谢任何帮助或小费...
如果我找到自己的答案,我会回去发布答案,但是到现在为止,我已经完全迷路了!
谢谢你们..
当您执行ALTER TABLE
语句时,数据库引擎隐式提交事务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.