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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【郑州校区】Hibernate事务管理

1.1. 事务介绍
问题:什么是事务?
        事务就是逻辑上的一组操作,组成这组操作的各个单元要么全部成功,要么全都失败。
问题:事务四个特性?
        原子性:不可分割
        一致性:事务在执行前后,要保证数据的一致。
        隔离性:一个事务在执行的过程中,不应该受到其它事务的干扰。
        持久性:事务一旦结束,数据持久化到数据库。
问题:不考虑事务的隔离性,会产生什么问题?
        脏读:一个事务读取到另一个事务的未提交数据
不可重复读:一个事务读取到另一个事务提交的数据(主要是指update),会导致两次读取的结果不一致。
虚读(幻读): 一个事务读取到另一个事务提交的数据(主要是指insert),会导致两次读取结果不一致.
问题:对于上述问题如何解决?
        我们可以通过设置隔离级别来解决.
        READ_UNCOMMITED 读取未提交,它引发所有的隔离问题
        READ_COMMITTED  读已提交,阻止脏读,可能发生不可重复读与虚读.
        REPEATABLE_READ 重复读  阻止脏读,不可重复读 可能发生虚读
SERIALIZABLE 串行化 解决所有问题 不允许两个事务,同时操作一个目标数据。(效率低下)
ORACLE  默认的是事务隔离级别  READ_COMMITTED
MYSQL 默认的事务隔离级别  REPEATABLE_READ
1.2. Hibernate中设置事务隔离级别
hibernate.connection.isolation
它可取的值有 1 2 4 8
1代表的事务隔离级别为READ UNCOMMITTED
2代表的事务隔离级别为READ COMMITTED
4.代表的事务隔离级别为 REPEATABLE READ
8代表的事务隔离级别为 SERIALIZABLE
在hibernate.cfg.xml文件中配置
1.3. Hibernate中session管理
Hibernate提供了三种管理session的方式:
1. Session对象的生命周期与本地线程绑定(ThreadLocal)
2. Session对象的生命周期与JTA事务绑定(分布式事务管理)
3. Hibernate委托程序来管理Session的生命周期
我们之前所使用的是第三种 ,通过程序获取一个Session对象,使用它,最后session.close();
在实际开发中我们一般使用的是前两种:
        主要介绍关于本地线程绑定Session。
        步骤:
1. 需要在hibernate.cfg.xml文件配置
2. 在获取session时不要在使用openSession而是使用getCurrentSession()方法。
关于getCurrentSession使用时的注意事项:
上述代码执行后,会产生问题
原因:使用getCurrentSession获取的与线程绑定的session对象,在事务关闭时,session对象也会close,简单说,就不需要我们在手动close;
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马