Hibernate_day02(下)

本文深入探讨Hibernate框架中的一级缓存机制,包括快照原理及其对数据更新效率的提升,以及不同事务隔离级别的详细解析,如脏读、不可重复读、幻读等问题的产生与解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hibernate的一级缓存

Hibernate框架柱中提供了两种缓存机制: 一级缓存、二级缓存.
Hibernate的一级缓存称之为session级别缓存,一级缓存生命周期以session一致.一级缓存是自带的不可卸载

Hibernate的一级缓存机制,图片来自微信公众号Java患者

一级缓存区中的快照区
快照原理

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释放资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值