关于Mybatis一级缓存

关于Mybatis一级缓存的介绍 https://yq.aliyun.com/articles/18678 这篇已经介绍的非常详尽了。

但是读完以后我产生了一个疑问,如果在同一个session中2次相同的数据库操作之间,DB里的数据改变了,Mybatis一级缓存如何确保数据一致性,带着以上疑问我做了如下实验:

 

1.方法级别没有开启@Transactional,Mybatis查询记录如下

 测试函数:

在以下函数第四行处会打一个端点,在断点期间,我会手工进行数据库操作

    public String getTest() {
        List<String> s=dao.getTest();
        System.out.println(s.size());
        List<String> s2=dao.getTest();
        System.out.println(s2.size());
        return "ok";
    }

日志打印

 



 

 

 第一次打印1,由于没有开启事物控制,所以session被关闭,第二次dao查询又重新开启了一次sqlsession,所以没有走一级缓存

 

 

 

 

 

2.方法级别开启了@Transactional,Mybatis查询记录如下

测试函数:

在以下函数第四行处会打一个端点,在断点期间,我会手工进行数据库操作

    @Transactional
    public String getTest() {
        List<String> s=dao.getTest();
        System.out.println(s.size());
        List<String> s2=dao.getTest();
        System.out.println(s2.size());
        return "ok";
    }

 



 

  可见第二次Dao实际是从缓存中获得数据,所以拿到的数据量还是1行,即使我已经在库中插入了2条username='186251732**'的记录 

 

 

 

 

结论:

Mybatis一级缓存在无事物的情况下确实提高了效率减轻了DB压力,但是在事物的里也会存在数据不一致的问题,必要时候需要采取一定的手段(数据库锁,线程锁)来保证数据一致性

 

  原创文章,转载请声名出处  http://spjich.iteye.com/admin/blogs/2353479

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值