所以我在 OpenEJB 和 Hibernate 中使用容器管理的事务,并且我有一个相当简单的事务回滚场景,我正试图开始工作。我的数据库管理系统是 MySQL。
我从一个具有默认事务传播(必需)的无状态 EJB 开始,它执行一些基本的实体操作/创建。
我还有第二个无状态 EJB,它有一个用于指定传播的注释(但它仍然只是“必需的”)。从第二个 EJB 方法中,我调用了第一个 EJB 的方法,它执行基本的实体操作/创建。我得到一个还没有 ID 的实体,所以我调用了 entityManager.flush(),它为我提供了一个 ID,可以处理从第一个 EJB 返回的实体。
这是我遇到问题的地方。第二个 EJB 现在有一个问题,可能是系统异常,或者是某种异常。我想强制回滚,所以这个 EJB 有一个 @Resource SessionContext ctx 成员,我用它来调用 ctx.setRollbackOnly()。
这是我在日志中看到的:
调试 - 需要 TX:已启动事务 org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca
....东西,最终堆栈跟踪我正在记录....
调试 - 需要 TX:事务 org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca 上的 setRollbackOnly()
调试 - 需要 TX:回滚事务 org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca
但是当我检查数据库时,来自第一个 EJB 的更改仍在数据库中。我错过了什么?