所以我在 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/