黑马程序员技术交流社区

标题: 请教这2代码,执行的时候有什么不同. [打印本页]

作者: HeiMa-黄倲江    时间: 2012-10-25 22:24
标题: 请教这2代码,执行的时候有什么不同.
第一:
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();
                        }
                }
作者: 王禹衡    时间: 2012-10-25 22:33
异常处理不同啊  第二个通过catch捕捉异常并回滚进程,打印错误异常
作者: HeiMa-黄倲江    时间: 2012-10-25 22:39
wangyuheng 发表于 2012-10-25 22:33
异常处理不同啊  第二个通过catch捕捉异常并回滚进程,打印错误异常

那执行第一段代码的时候,不用回滚事物吗?
还是执行到数据库的时候,会自己回滚事物,
这2代码,除了能打印出异常之外.还有别的什么不同吗?
作者: 付维翔    时间: 2012-10-25 22:49
这个两处代码的不同之处在于,前者没有捕获异常,调用rollback()方法。而后者,捕获并做了处理,调用了rollback()方法。在实际用的时候,两者都能保障事务的一致性。但是这些应该是有前提的:假如,我们没有启自动回滚事务的功能,但第一段代码,就不能保证事务的一致性。根据Hibernate的源码,我们可以得知:rollback()方法的功能用于表示,强制事务回滚。因此,建议使用第二种方式,安全
作者: 李连闯    时间: 2012-10-25 23:10
第一段代码的问题在于,没有处理进行捕捉和处理 数据保存的过程中出现的 可能会造成程序运行中断的致命异常,这是不正确的做法,
回滚的原因在于,如果异常产生,而且操作已经对数据库进行了部分修改导致了数据的不正确性,就需要撤销异常发生前执行过的错误操作,使数据库的数据保持正确的状态,所以第二段代码才是正确的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2