gpt4 book ai didi

java - 如果不回滚 Hibernate 中的事务会发生什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:31:16 26 4
gpt4 key购买 nike

我读到的关于 Hibernate 的所有内容都指出,当发生错误时,您必须回滚事务并关闭 session ,并且以下代码(取自 Hibernate 的文档)通常有一些变体作为示例:

Session sess = factory.openSession();
Transaction tx = null;
try {
tx = sess.beginTransaction();
// do some work
...
tx.commit();
} catch (RuntimeException e) {
if (tx != null) tx.rollback();
throw e; // or display error message
} finally {
sess.close();
}

出于几个原因,这种模式对我来说似乎很奇怪。首先,对于一个通常旨在使事情变得简单的框架来说,它似乎过于复杂。更重要的是,如果 try block 中的代码抛出 RuntimeException 以外的东西会怎样?在这种情况下,Hibernate 似乎必须能够通过打开的事务优雅地关闭 session ,大概是通过回滚它,但如果这是真的,为什么还要费心调用 rollback 呢?

最佳答案

Hibernate 可能会使很多事情变得更简单,但事务管理并不是很简单,因此对于每个事务,您都必须非常仔细地考虑您想要什么。 Hibernate 无法帮助您。

如果 try block 中的代码抛出 RuntimeException 以外的任何内容,您的事务显然不会提交。但是您也没有明确回滚。 finally block 中的 sess.Close 调用也不会回滚事务。发生什么取决于这是否是嵌套事务:

  • 如果不是,则最终事务超时并回滚。
  • 如果是,父事务将在提交自身时看到子事务尚未提交。这将导致整个事务的回滚。

关于java - 如果不回滚 Hibernate 中的事务会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3588044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com