也许这是一个愚蠢的问题,但如果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();
}
}发布于 2012-04-18 16:05:04
答案取决于em.merge(person)方法的细节和您的数据库驱动程序的实现。
如果该方法只执行一条update语句,则rollback是多余的。然而,如果它可能运行多个更新,那么就不那么清楚了。
我个人会把它放在那里
如果在某些更新完成后删除了rollback,并且您的merge方法出错,但其他更新没有完成,则在没有显式commit或rollback的情况下关闭数据库连接将提交或回滚事务,这取决于驱动程序实现。根据javadoc for java.sql.Connection的说法,行为取决于实现。因此,如果您不在错误时rollback自己,您可能最终提交部分更新。
https://stackoverflow.com/questions/10205210
复制相似问题