zoukankan      html  css  js  c++  java
  • 【问题记录】mybatis开启事务方法时,一级缓存可能引发的问题

    首先,上代码:

        public void listMybatisModel() {
            List<MybatisModel> mybatisModels = mapper.listMybatisModel();
            List<MybatisModel> mybatisModelsOther = mapper.listMybatisModel();
            System.out.println(mybatisModels == mybatisModelsOther);
            System.out.println("list count: " + mybatisModels.size());
        }
    

    listMybatisModel是使用springAOP控制的事务方法,方法中:

    System.out.println(mybatisModels == mybatisModelsOther);
    

    输出竟然是true!也就是说,它们使用的是同一个内存地址。所以我们可以想象这种情况:

        public void listMybatisModel() {
            List<MybatisModel> mybatisModels = mapper.listMybatisModel();
            // 对mybatisModels的值进行改变
            // ...
            // 那么mybatisModelsOther的值也会跟着改变,而不是取到正确的数据库的值,造成数据错误
            List<MybatisModel> mybatisModelsOther = mapper.listMybatisModel();
            System.out.println(mybatisModels == mybatisModelsOther);
            System.out.println("list count: " + mybatisModels.size());
        }
    

    解决办法:在Sql映射文件标签中加入属性 flushCache="true"

    <select ... flushCache="true" >
    
  • 相关阅读:
    tab下图片要求
    segmentController
    下拉加载更多
    获取用户信息
    时间选择器
    JavaScript标准库之 ----  Object
    JavaScript标准库之——JSON
    JavaScript标准库之
    post网络请求坑
    构造一个简单的Linux系统MenuOS
  • 原文地址:https://www.cnblogs.com/zeling/p/8628138.html
Copyright © 2011-2022 走看看