加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 是否有必要在catch-block中对事务进行回滚?

发布时间:2020-12-14 19:19:16 所属栏目:Java 来源:网络整理
导读:也许是一个愚蠢的问题,但是如果EntityManager.merge()抛出异常,是否有必要在catch-block中对事务进行回滚? 或者异常本身是否意味着合并不起作用,以便下次运行commit时抛出异常的先前更改将不适用? 例: public void setPerson(Person person) {EntityManag

也许是一个愚蠢的问题,但是如果EntityManager.merge()抛出异常,是否有必要在catch-block中对事务进行回滚?
或者异常本身是否意味着合并不起作用,以便下次运行commit时抛出异常的先前更改将不适用?

例:

public void setPerson(Person person) {
EntityManagerFactory emf =   Persistence.createEntityManagerFactory("MyLib");
     EntityManager em = emf.createEntityManager();
     try {            
         if(!em.getTransaction().isActive()){
            em.getTransaction().begin();
         }
         em.merge(person);
         em.getTransaction().commit();
         emf.getCache().evict(Person.class); // clear Person cache
     } catch (Exception ex){
         em.getTransaction().rollback(); // Is this necessary?   
     } finally {
         em.close();
     }
}
最佳答案
答案取决于em.merge(person)方法的细节和数据库驱动程序的实现.

如果该方法仅执行一个更新语句,则回滚是多余的.但是,如果它可以运行多个更新,那么它就不那么清楚了.

我个人会把它留在那里

如果删除回滚并且您的merge方法在完成某些更新但其他更新未完成后出错,那么在没有显式提交或回滚的情况下关闭数据库连接将提交或回滚事务,具体取决于驱动程序实现.根据javadoc for java.sql.Connection,行为取决于实施.因此,如果您因错误而无法自行回滚,则最终可能会提交部分更新.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读