gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:44:28 25 4
gpt4 key购买 nike

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

我只是想创建一个 CMT EJB,做一些成功的数据库操作,但在最后一个操作上失败(SQLException)。我希望回滚所有操作,但它没有发生....

我的环境:

  • MySQL 5.5
  • 玻璃鱼 3.0.1
  • hibernate

我的 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”的最后一行,代码执行成功。所以注入(inject)、SQL 连接、数据库都在工作(可能配置错误)。

我注意到在逐行调试(并使用另一个程序逐行查询数据库)时,在“DROP FOREIGN”语句之前表中没有任何更改,之后,提交了先前的语句(其他连接可见/程序)。在方法结束之前!

当 EJB 返回时,我的“CMTTest”属性值为“8”并且我的 FOREING KEY 被 DROPPED,没有任何东西被 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 Pool 配置为:

Edit JDBC Connection Pool

Edit JDBC Connection Pool

Edit JDBC Connection Pool Advanced Attributes

Edit JDBC Connection Pool Advanced Attributes

Edit JDBC Connection Pool Properties

Edit JDBC Connection Pool Properties

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

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

谢谢大家..

最佳答案

当您执行 ALTER TABLE 语句时,数据库引擎 implicity commits the transaction.

关于Java/EJB 3.0 CMT/JTA/MySQL/Hibernate - 事务不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19550363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com