所以我在OpenEJB和Hibernate中使用容器管理事务,我有一个相当简单的事务回滚场景,我正试图开始工作。我的DBMS是MySQL。
我从一个无状态EJB开始,它具有执行一些基本实体操作/创建的默认事务传播(必需)。
我还有第二个无状态EJB,它有一个指定传播的注释(但它仍然只是'必需')。从第二个EJB方法开始,我调用第一个EJB方法来执行基本的实体操作/创建。我找回了一个还没有ID的实体,所以我调用了entityManager.flush(),它给了我一个ID来处理从第一个EJB返回的实体。
这是我遇到问题的地方。第二个EJB现在有一个问题,无论是系统异常,还是某种异常。我想强制回滚,所以这个EJB有一个@Resource SessionContext ctx成员,我用来调用ctx.setRollbackOnly()。
这就是我在日志中看到的内容:
DEBUG - TX必需:已启动事务org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca
....东西,最终堆栈跟踪我正在记录....
DEBUG - TX必需:事务上的setRollbackOnly()org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca
DEBUG - TX必需:回滚事务org.apache.geronimo.transaction.manager.TransactionImpl@540eb4ca
但是当我检查数据库时,第一个EJB的更改仍然在数据库中。我错过了什么?
答案 0 :(得分:3)
也许您使用MyISAM作为桌面的存储引擎。它不支持事务,而是使用InnoDB。