2011-02-08 68 views
2

因此,我在OpenEJB和Hibernate中使用容器管理的事务,并且我尝试使用相当简单的事务回滚场景。我的DBMS是MySQL。休眠的EJB事务回滚

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

我也有第二个无状态的EJB,它有一个指定传播的注释(但它仍然是'必需的')。从第二个EJB方法中,我调用了第一个EJB的方法来完成基本的实体操作/创建。我找回了一个还没有ID的实体,所以我调用了entityManager.flush(),它为我提供了一个ID来处理从第一个EJB返回的实体。

这是我遇到问题的地方。第二个EJB现在有一个问题,无论是系统异常还是某种异常。我想强制回滚,所以这个EJB有一个@Resource SessionContext ctx成员,我用它来调用ctx.setRollbackOnly()。

这是我在日志中看到:

DEBUG - TX要求:开始交易[email protected]

....东西最终堆栈跟踪我登录....

DEBUG - TX要求:在交易使用setRollbackOnly()[email protected]
DEBUG - TX要求:回滚事务[email protected]

但是,当我检查数据库,从第一个EJB的变化还是在数据库中。我错过了什么?

回答

3

也许你使用MyISAM作为你的表的存储引擎。它不支持事务,而是使用InnoDB。

+0

这正是我的问题。谢谢!对于任何想从马的嘴巴听到它的人:http://forums.mysql.com/read.php?21,68686,68686 – lakemalcom