2

所以我在 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 的更改仍在数据库中。我错过了什么?

4

1 回答 1

3

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

于 2011-02-08T21:34:46.187 回答