好吧,我在www.example.com上看到了下面的代码jboss.orghttps://docs.jboss.org/hibernate/orm/5.0/javadocs/org/hibernate/Session.html
典型的事务应使用以下习惯用法:
Session sess = factory.openSession();
Transaction tx;
try {
tx = sess.beginTransaction();
//do some work
...
tx.commit();
}
catch (Exception e) {
if (tx!=null) tx.rollback();
throw e;
}
finally {
sess.close();
}
如果“我的工作”只是从数据库中阅读数据,是否应该包括rollback语句(例如,类似于users = session.createQuery(“fromUser”).getResultList();)或者我可以省略“catch”代码吗?如果我在数据库中更改某些内容,比如“session.delete(session.get(User.class,id))",也会出现同样的问题?
在我看来,如果在操作过程中出现异常,更新将不会完成。由于它只是一个操作,因此没有什么可回滚的。在这种情况下,是否应该在代码中包含rollback()?如果它只是一个操作,它有什么意义?
我试图找到一些解释什么时候在web和文档中真正需要rollback(),但不幸的是没有成功。我个人认为只有当一个事务中包含两个或更多的update语句,并且它们都需要完成或都需要回滚时才需要它。
1条答案
按热度按时间xzv2uavs1#
如果你启动了一个事务,你必须结束这个事务,要么提交要么回滚。即使你执行了一个单一的语句,即使这个单一的语句失败。事实上,如果你启动了一个事务,但没有在该事务中做任何事情,你需要提交或回滚。
未能结束事务可能会导致资源泄漏和其他并发问题(尽管确切的影响取决于底层数据库系统和驱动程序)。