SqlSession继承路径
MyBatis
一级缓存的存储
了解 缓存类图
事务隔离级别
结论:MyBatis以及缓存反而提升了事务隔离级别。
同一种情况,数据库事务发生不可重复读,MyBatis的情况。
MyBatis解决了数据库事务不可重复读的问题。
数据库事务的不可重复读:
不可重复读:在事务1期间事务2更新了数据,导致事务1两次查询解雇偶不一致。简称,读提交。
同一种情况,数据库事务脏读和MyBatis脏读情况对比
MyBatis解决了数据库事务脏读的问题。
数据库事务的脏读(不带MaBatis缓存):
脏读:事务1读取了事务2已经修改但尚未提交的数据,如果事务2发生回滚则事务1读取的数据就错误数据,也称脏数据。简称,读未提交。
注意:由于关闭关闭Session、执行Commit、执行Rollback都会清空MyBatis的一级缓存,所以实际上 MyBatis一级缓存的生命周期是在数据库事务的生命周期之内的。
网传MyBatis一级缓存的脏读 示例(实际不会发生)
clearCache主动清楚
在执行SqlSession.clearCache()之后,缓存会被清空,第二次查询会查询库。
update更新
在执行insert、update、delete操作之后,缓存会被清空,第二次查询会查询数据库。
注意:与表无关。即使我们要查询的和要更新的表不是同一张表,MyBatis依然会清空所有的一级缓存。
rollback回滚
在执行SqlSession.rollback()之后,缓存会被清空,第二次查询会查询数据库。
commit提交
在执行SqlSession.commit()之后,缓存会被清空,第二次查询会查询数据库。
关闭Session的代码类图
通过反射,验证了关闭Session的时候确实是会清空缓存。
MyBatis产生缓存,实际是通过图中的方法
111111
会导致mybatis一级缓存清空的几种情况:
1、session关闭
2、session commit和rollback
3、session update、insert、delete(查询和更新的不是同一张表也会清空所有的以及缓存)
4、session主动调用clearCache
update()执行select标签不会报错。
mybatis产生缓存并不是根据查询标签的类型(select或者update等标签)决定的。与sqlSession调用的方法有关。