了解:
- 数据库中若执行了单个增删改操作,会自动为其开始事务;若在service层为了某个方法开始了事务管理,(通过Spring的声明式事务管理),则数据库中不再为操作开启事务,因为业务层的事务管理就是数据库中的事务管理。
- 持久层访问数据库时,每次访问均需要sqlSession对象,有了该对象才能访问数据库,而sqlSession对象是由mybatis中的sqlSessionFactory来提供的,这里使用了工厂模式,每次访问数据时,都会从该工厂获取一个sqlSession对象
myBatis一级缓存:
一级缓存是sqlsession级别的缓存,同一个事务共享一个sqlsession对象,在事务中若执行查询操作,会将查询到的数据缓存到以及缓存中,后续若再次查询相同的数据,直接从缓存中获取;
查询的操作顺序:
先去一级缓存中查,若有,直接返回,若无,再去数据库中查
注:若事务在查询后执行了update(delete,inster)操作,此时清空一级缓存
一级缓存的意义:
提高了查询效率;
(对数据库IO操作ms级别;对内存IO操作ns级别)
二级缓存:
是mapper/namespace级别的缓存(默认关闭的)
必须通过设置来开启:
1.在mybatis的配置文件中添加属性:cachable:true
2.在想开启二级缓存的mapper的xml文件中添加一组标签(添加为mapper的子标签),
<cache></cache>
<mapper namespace="">
<cache/>
</mapper>
二级缓存可以实现跨sqlsession的数据共享,但是若操作该mapper的多个sqlsession中,有一个执行update操作,则立即清空二级缓存
一级二级都存在时,事务中的查询顺序:二级缓存--------.>一级缓存-------------->数据库