如果不在Hibernate中回滚事务,会发生什么?
我所读到的关于Hibernate的一切都表明,当发生错误时,您必须回滚事务并关闭会话,并且通常会给出以下代码(取自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
块中的代码抛出RuntimeException
之外的其他内容,会发生什么情况? 看起来好像Hibernate必须能够在这种情况下正常关闭会话,大概是通过回滚,但如果这是真的,为什么麻烦调用rollback
呢?
Hibernate可能使许多事情变得更简单,但事务管理并不是很简单,因此对于每一个事务,你都必须非常仔细地考虑你想要的东西。 Hibernate无法帮助你。
如果try
块中的代码抛出除RuntimeException
之外的任何其他内容,那么您的事务显然不会提交。 但是你也没有明确地回滚。 您的finally
块中的sess.Close
调用也不会回滚事务。 发生什么取决于这是否是嵌套事务:
更重要的是,如果try块中的代码抛出RuntimeException之外的其他内容,会发生什么情况?
如果RuntimeException之外的try块中的代码块中有任何其他异常,那么这必须是一个检查异常,它将被编译器本身捕获,并且最终将把处理部分合并到你的代码。
在这个问题提供的例子中,我们只捕获RuntimeException,这是我认为是正确的编码方式。 通过这样做,我们可以立即回滚事务,而无需等待事务超时和最终回滚。 当我们继续抛出RuntimeException时,我们也没有打破异常流程。 这是更清晰和更明确的处理事务的方式,而不是让事务超时触发事务的回滚。
当然,我们不应该以捕获RuntimeException的方式捕获'Exception',原因很明显。
链接地址: http://www.djcxy.com/p/47585.html上一篇: What happens if you don't roll back a transaction in Hibernate?
下一篇: Android RelativeLayout height not following GridView height