【郑州校区】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口出
|