繁体   English   中英

Java / EJB 3.0 CMT / JTA / MySQL / Hibernate-事务不回滚

[英]Java / EJB 3.0 CMT / JTA / MySQL / Hibernate - Transaction not rolling back

我对EJB CMT失去了理智,大约一个星期了,找不到解决方案! 任何启发将不胜感激...

我只是想创建一个CMT EJB,执行一些成功的数据库操作,而最后一个失败(SQLException)。 我希望回滚所有操作,但不会发生...。

我的环境:

  • MySQL 5.5
  • 玻璃鱼3.0.1
  • 过冬

我的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连接池高级属性

编辑JDBC连接池高级属性

编辑JDBC连接池属性

编辑JDBC连接池属性

不知道还有什么要说的重要! 在此先感谢任何帮助或小费...

如果我找到自己的答案,我会回去发布答案,但是到现在为止,我已经完全迷路了!

谢谢你们..

当您执行ALTER TABLE语句时,数据库引擎隐式提交事务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM