【问题标题】:EJB transaction rollback with hibernate使用休眠的 EJB 事务回滚
【发布时间】:2011-06-23 17:52:39
【问题描述】:

所以我在 OpenEJB 和 Hibernate 中使用容器管理的事务,并且我有一个相当简单的事务回滚场景,我正试图开始工作。我的 DBMS 是 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 的更改仍在数据库中。我错过了什么?

【问题讨论】:

    标签: mysql hibernate transactions ejb openejb


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2013-05-05
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多