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

Rox*_*Rox 5 java transactions eclipselink

也许是一个愚蠢的问题,但是如果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();
     }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*s G 4

答案取决于em.merge(person)方法的细节和数据库驱动程序的实现。

如果该方法只执行一个更新语句,那么它rollback就是多余的。然而,如果它可能运行多个更新,那么就不太清楚了。

我个人会把它留在那里

如果rollback删除了并且您的merge方法在某些更新完成但其他更新未完成后出现错误,则无需显式关闭数据库连接commit,或者rollback将提交或回滚事务,具体取决于驱动程序实现。根据javadoc forjava.sql.Connection,行为取决于实现。rollback因此,如果您自己不犯错误,您最终可能会提交部分更新。

  • @Rox它不仅不会造成伤害,而且如果您想避免一些不良影响,这可能是必要的。 (2认同)