A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

第一:
try{
                        session = HibernateUtil.getSession();
                        tx = session.beginTransaction();
                        session.save(user);
                        tx.commit();
                       
                }finally{
                        if(session != null){
                                session.close();
                        }
                }

第二:

try{
                        session = HibernateUtil.getSession();
                        tx = session.beginTransaction();
                        session.save(user);
                        tx.commit();
                       
                }catch(HibernateException e){
tx.rollback();
e.printStackTrace();
}
finally{
                        if(session != null){
                                session.close();
                        }
                }

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
异常处理不同啊  第二个通过catch捕捉异常并回滚进程,打印错误异常
回复 使用道具 举报
wangyuheng 发表于 2012-10-25 22:33
异常处理不同啊  第二个通过catch捕捉异常并回滚进程,打印错误异常

那执行第一段代码的时候,不用回滚事物吗?
还是执行到数据库的时候,会自己回滚事物,
这2代码,除了能打印出异常之外.还有别的什么不同吗?
回复 使用道具 举报
这个两处代码的不同之处在于,前者没有捕获异常,调用rollback()方法。而后者,捕获并做了处理,调用了rollback()方法。在实际用的时候,两者都能保障事务的一致性。但是这些应该是有前提的:假如,我们没有启自动回滚事务的功能,但第一段代码,就不能保证事务的一致性。根据Hibernate的源码,我们可以得知:rollback()方法的功能用于表示,强制事务回滚。因此,建议使用第二种方式,安全

评分

参与人数 2技术分 +2 收起 理由
张榆 + 1
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第一段代码的问题在于,没有处理进行捕捉和处理 数据保存的过程中出现的 可能会造成程序运行中断的致命异常,这是不正确的做法,
回滚的原因在于,如果异常产生,而且操作已经对数据库进行了部分修改导致了数据的不正确性,就需要撤销异常发生前执行过的错误操作,使数据库的数据保持正确的状态,所以第二段代码才是正确的。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马