2012-04-18 83 views
5

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

例子:

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(); 
    } 
} 

回答

4

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

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

我个人保持有

如果rollback被删除,您merge方法错误,我们经过一些更新完成,但没有,那么其他人关闭数据库连接没有明确commitrollback将提交或回滚该事务取决于驱动程序的实现。根据javadoc for java.sql.Connection,行为取决于实施。因此,如果你自己没有出错,你最终可能会提交部分更新。

+0

但是你可以说在catch块中有回滚没有伤害吗?我对吗? – Rox 2012-04-18 08:20:11

+2

@Rox它不仅没有伤害,如果你想避免一些不良影响,它可能是必要的。 – 2012-04-18 08:21:20