【问题记录】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" >
posted @ 2018-03-23 01:14  zeling  阅读(1313)  评论(0编辑  收藏  举报