1

大约一周后,我对 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 连接池属性

不知道还有什么重要的说!只是提前感谢任何帮助或提示...

如果我自己找到答案,我会回来发布答案,但现在我完全迷路了!

谢谢你们..

4

1 回答 1

2

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

于 2013-10-23T21:36:44.087 回答