也许是一个愚蠢的问题,但是如果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();
}
}
答案 0 :(得分:4)
答案取决于em.merge(person)
方法的细节和数据库驱动程序的实现。
如果该方法只执行一个更新语句,则rollback
是多余的。但是,如果它可能会运行多个更新,那么就不那么清楚了。
我个人会留在那里
如果删除rollback
并且您的merge
方法在完成某些更新但其他更新完成后仍然出错,则关闭数据库连接而不显式commit
或rollback
将提交或回滚事务,具体取决于驱动程序实现。根据{{3}},行为取决于实现。因此,如果您没有rollback
自己出错,最终可能会提交部分更新。