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" >
    
  • 相关阅读:
    python urllib urllib2
    python 标准库获取网络信息
    dell N1500 安全配置
    python jinjia2模板使用
    flask-admin
    github使用
    python中文处理
    C++输入和输出中进制问题
    hdu1708(C++)
    hdu1017(C++)
  • 原文地址:https://www.cnblogs.com/zeling/p/8628138.html
Copyright © 2011-2022 走看看