Hibernate的一级缓存
Hibernate框架柱中提供了两种缓存机制: 一级缓存、二级缓存.
Hibernate的一级缓存称之为session级别缓存,一级缓存生命周期以session一致.一级缓存是自带的不可卸载
一级缓存区中的快照区
快照原理
hibernate的快照机制和session缓存机制一样也是为了提高程序的执行效率,session缓存是为了提高程序在获取数据时的效率,而快照则是为了提高程序在更新数据时的效率。在hibernate将数据封装成对象放入session缓存中时,同时也会复制一份数据放入session缓存的快照中,当程序调用uadate()方法并提交事务之后,hibernate不会直接向数据库发送sql语句执行更新操作,而是会先清理缓存,比对缓存和快照中的对象属性是否一致,如果一致,则不执行update语句,即不会向数据库发送sql语句,如果不一致,则将数据同步更新到数据库中,并更新快照区。
Hibernate事物管理
回顾事物: 事物的特性
原子性: 代表事物不可分割
一致性:代表事物执行前后,数据完整性保存一致
隔离性: 代表一个事物的过程中,不应该受到其他事物的影响
持久性: 代表事物执行完成后,数据就持久到数据库中
不考虑隔离性会引发的安全性问题
- 脏读
- 不可重复读
- 虚读
事物的隔离级别
- 1.READ UNCOMMITTED(未提交读): 在RU的隔离级别下,事务A对数据做的修改,即使没有提交,对于事务B来说也是可见的,这种问题叫脏读。这是隔离程度较低的一种隔离级别,在实际运用中会引起很多问题,因此一般不常用。
- 2.READ COMMITTED(提交读): 在RC的隔离级别下,不会出现脏读的问题。事务A对数据做的修改,提交之后会对事务B可见。 举例,事务B开启时读到数据1,接下来事务A开启,把这个数据改成2,提交,B再次读取这个数据,会读到最新的数据2。在RC的隔离级别下,会出现不可重复读的问题。这个隔离级别是许多数据库的默认隔离级别。
- 3.REPEATABLE READ(可重复读): 在RR的隔离级别下,不会出现不可重复读的问题。事务A对数据做的修改,提交之后,对于先于事务A开启的事务是不可见的。举例,事务B开启时读到数据1,接下来事务A开启,把这个数据改成2,提交,B再次读取这个数据,仍然只能读到1。在RR的隔离级别下,会出现幻读的问题。幻读的意思是,当某个事务在读取某个范围内的值的时候,另外一个事务在这个范围内插入了新记录,那么之前的事务再次读取这个范围的值,会读取到新插入的数据。Mysql默认的隔离级别是RR,然而mysql的innoDB引擎间隙锁成功解决了幻读的问题。
- 4.SERIALIZABLE(可串行化); 可串行化是最高的隔离级别。这种隔离级别强制要求所有事物串行执行,在这种隔离级别下,读取的每行数据都加锁,会导致大量的锁征用问题,性能最差。
Hibernate配置事物的隔离级别
<!--核心配置文件中写入-->
<property name=”hibernate.connection.isolation”>4</property> //可填1,2,4(不可重复读),8
Hibernate如何解决service中的事物问题
Hibernate框架内部会自动进行线程绑定session
在Hibernate中SessionFactory提供了一个方法getcurrentSession();该方法可以获取当前线程中的session
注意getcurrentSession()方法不能直接使用(默认不开启需配置),需要在Hibernate核心配置文件中进行配置才能使用该方法
配置当前线程绑定的session
<!--配置线程绑定session-->
<property name=”hibernate.current_session_contest_class”>thread</property>
注意: 当使用线程绑定session时不需要关闭session释放资源,在线程结束时会自动关闭session释放资源