可重复读(REPEATABLE READ)
在同一个事务内,会保留第一次查询的缓存结果,即使更新和删除,后续查询也会使用第一次。
提交读(READ COMMITTED)
在同一个事务内,不会保留提交事务。
-- 查询当前隔离级别 SELECT @@tx_isolation
SET @@tx_isolation = REPEATABLE_READ -- 原READ-COMMITTED
-- 注入隔离级别 set session transaction isolation level repeatable read;
set session transaction isolation level read committed
-- 注入事务提交方式 在同一个事务内,会保留第一次查询的缓存结果,即使更新和删除,后续查询也会使用第一次。 SELECT @@autocommit; -- 1代表自动提交 0代表手动提交
SET @@autocommit=0;
BEGIN
select * from order where id = 80
update order set create_by = 'admin66' where id = 80
select * from order where id = 80
commit
MyBatis 框架开启事务后,不会管数据库的隔离级别第二还是第三,都会走自己的1级缓存机制。
- 第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从 数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。
- 如果中间sqlSession去执行commit操作(执行插入、更新、删除),则会清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
- 第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直 接从存中获取用户信息
MyBatis如何关闭一级缓存(分注解和xml两种方式)
第一种:xml形式(关闭所有一级缓存)【未测试】
第二种:注解形式(可指定仅仅某个Mapper关闭注解)【本人测试并没有成功,该标签】
@Options(flushCache = Options.FlushCachePolicy.TRUE)
@Select("select * from ge_jdbc_datasource where id = #{id,jdbcType=BIGINT} and status = 1")
@ResultMap("resultMap")
JdbcDataSource find(Long id);
第三种:sql动态拼接传入的随机数(亲测可行,原理通前端?时间戳)
select id from ge_jdbc_datasource where id = 1 and STATUS = 1
AND new Date() = new Date