最近在学Hibernate时, 发现事务操作的rollback()在try, catch, finally中的位置不同会有影响:
try{
session = HibernateSessionFactory.getSession();
ts = session.beginTransaction();
session.save(book);
id = book.getBookid();
ts.commit();
}catch(HibernateException e){
throw e;
}finally{
if(ts != null){
ts.rollback();
}
HibernateSessionFactory.closeSession();
}
上面的代码rollback()在finally中, 运行时会有如下错误:
Exception in thread "main" org.hibernate.TransactionException: Transaction not successfully.
而下面把rollback()写在catch中却能正常工作:
try{
session = HibernateSessionFactory.getSession();
ts = session.beginTransaction();
session.save(book);
id = book.getBookid();
ts.commit();
}catch(HibernateException e){
if(ts != null){
ts.rollback();
}
throw e;
}finally{
HibernateSessionFactory.closeSession();
}
这是为什么呢? 求大牛解答疑惑啊!
Hibernate transaction rollback
------解决方案--------------------
finally中的代码是绝对执行的,如果说你的ts.commit()都执行了,你再去rollback肯定会报错。。
再来说第二个,catch中的代码是抛出异常的时候才会执行,也就是说,如果你的代码走到了ts.commit()这一句,并没有抛出异常,所以代码也不会去执行catcha中rollback,如果抛出异常,那肯定实在commit之前,那么没有commit,执行rollback是不会报错的。。。