java 是否应该为所有事务都包含一个“catch”块和其中的rollback()?

moiiocjp  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(107)

好吧,我在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语句,并且它们都需要完成或都需要回滚时才需要它。

xzv2uavs

xzv2uavs1#

如果你启动了一个事务,你必须结束这个事务,要么提交要么回滚。即使你执行了一个单一的语句,即使这个单一的语句失败。事实上,如果你启动了一个事务,但没有在该事务中做任何事情,你需要提交或回滚。
未能结束事务可能会导致资源泄漏和其他并发问题(尽管确切的影响取决于底层数据库系统和驱动程序)。

相关问题