【问题标题】:Why does transaction.wasCommitted() return false?为什么 transaction.wasCommitted() 返回 false?
【发布时间】:2026-02-26 06:25:01
【问题描述】:

我是 hibernate 和 java-ee 的新手,我想知道是否有人能告诉我为什么这段代码返回 false,即使通过查看数据库我可以看到事务实际上已提交:

    session.beginTransaction();
    session.saveOrUpdate(user);
    session.getTransaction().commit();
    return session.getTransaction().wasCommitted(); //Always false

谢谢!

【问题讨论】:

  • 来自 API javadoc:Check if this transaction was successfully committed. This method could return false even after successful invocation of commit(). As an example, JTA based strategies no-op on commit() calls if they did not start the transaction; in that case, they also report wasCommitted() as false. 不知道这是否解释了什么。
  • 因为提交不一定发生在你请求它之后(也许 commit() 在另一个线程中启动)等等......无论如何要求你刚刚做的事情是没有意义的(这个就像在执行 a = 2 + 1) 之后询问 a == 3)。
  • 这很奇怪,为什么有一个不起作用的方法?

标签: java mysql hibernate jakarta-ee glassfish


【解决方案1】:

wasCommitted() 不需要总是返回true,即使提交成功。如果交易是(明确地)committed,它将通过本地交易返回truefalse 否则。

来自docs:-

已提交

即使在成功调用 犯罪()。例如,基于 JTA 的策略 no-op on commit() 调用 如果他们没有开始交易;在这种情况下,他们还报告 wasCommitted() 为假。

【讨论】: