mysql数据库(隔离级别)与mybatis一级缓存半坑

552 阅读2分钟

可重复读(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级缓存机制。

  1. 第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从 数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。
  2. 如果中间sqlSession去执行commit操作(执行插入、更新、删除),则会清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
  3. 第二次发起查询用户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