mybatis 在开启二级缓存后 和悲观锁之间的

来源:互联网 发布:局部全局优化算法 编辑:程序博客网 时间:2024/06/11 11:08

因为最近准备在下一个项目将orm框架从hibernate改成mybatis所以便对mybatis做了一些测试。

环境:mysql ,由mybatis-generator 生成了如下的mapper文件


在mapper文件中开启了二级缓存之后发现不仅普通的select语句会被缓存击中,加上了for update的语句也会被缓存击中。而导致数据库加锁失败,

不过这也正常。(这里其实有点想当然了,因为for update可以超出事务隔离级别限制获取最新的数据,让我产生了for update可以无视缓存的错觉),

在发现这点之后,我便第一时间想到了select 的一个自带属性 flushCache 马上接着开始测试


预测结果,普通的select 被二级缓存击中,for update语句刷新缓存成功对表记录进行加锁

因为普通的select 和 带for update的select 所缓存的并不是同一个对象


结果


结果如图。。事与愿违。明明只在for update的节点元素上增加了刷新缓存的属性。但结果却导致了两个对象不同的实际对象在命中二级缓存之后都进行了缓存的刷新。

因为我对mybatis二级缓存原理并不是很了解。最后只好在另一个未开启二级缓存的mapper文件中重新配置了for update的select元素节点。

终于保证了普通查询能继续调用二级缓存。for update语句能对记录进行加锁。不知道。能否有更好的方法来解决呢?

原创粉丝点击