mysql - 使用 hibernate 回滚 EJB 事务

标签 mysql hibernate transactions ejb openejb

所以我在 OpenEJB 和 Hibernate 中使用容器管理的事务,并且我有一个相当简单的事务回滚场景,我正在尝试开始工作。我的数据库管理系统是 MySQL。

我从一个无状态 EJB 开始,它具有执行一些基本实体操作/创建的默认事务传播(必需)。

我还有第二个无状态 EJB,它具有用于指定传播的注释(但它仍然只是“必需”)。从第二个 EJB 方法中,我调用第一个 EJB 的方法来执行基本的实体操作/创建。我返回一个还没有 ID 的实体,因此我调用了entityManager.flush(),它为我提供了一个 ID,用于处理从第一个 EJB 返回的实体。

这就是我遇到问题的地方。第二个 EJB 现在有问题,可能是系统异常,也可能是某种异常。我想强制回滚,因此该 EJB 有一个 @Resource SessionContext ctx 成员,我用它来调用 ctx.setRollbackOnly()。

这是我在日志中看到的内容:

DEBUG - TX Required: Started transaction org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca

....东西,最终我正在记录堆栈跟踪...

DEBUG - TX Required: setRollbackOnly() on transaction org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca
DEBUG - TX Required: Rolling back transaction org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca

但是当我检查数据库时,第一个 EJB 的更改仍然在数据库中。我错过了什么?

最佳答案

也许您使用 MyISAM 作为表的存储引擎。它不支持事务,请改用InnoDB。

关于mysql - 使用 hibernate 回滚 EJB 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938657/

相关文章:

php - 检查数据库连接,否则显示消息

mysql:按相同字段值对周围记录进行分组

java - 在 JPA 实体上实现 "touch"?

java - 提交 session 时 hibernate 错误

java - 无法运行 Java 验证 (JSR 303)

mysql - 使用事务轨在同一操作 Controller 中对多个数据库进行查询?

php - 在 MySQLi 中使用 "begin_transaction"方法有什么好处?

mysql - 设置 Int16 溢出时的累加值

mysql - 最佳实践 - 在本地 mysql 服务器/RDS 上开发?

java - 如何使用 Objectify 在 Google Cloud Platform 中的多个实体上使用事务?