5

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

例子:

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

1 回答 1

4

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

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

我个人会把它放在那里

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

于 2012-04-18T08:05:03.753 回答