Mybatis一级缓存和mybatisplus 踩坑记

本文记录了一次由于Mybatis一级缓存和MybatisPlus使用不当导致的线上问题。在同一个事务内,删除并重新插入A类商品照片后,无法查找到新插入的数据。经过排查,发现问题出在MybatisPlus的updateBatch和selectList方法使用了不同的sqlSession,导致一级缓存未被正确清除,从而影响了数据的查询。解决方案是手动清理缓存或避免在一个事务中混合使用不同sqlSession的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事故描述

某商品的照片分两种类型:A商品外观照片 和 B商品配件照片两个相册 ,它们保存在同一张picture表中。

在一个事务内按照片类型批量更新商品照片,但操作人只有保存A类型照片的权限,因需要将该商品A照片清空,然后插入新A类照片,然后取商品所有照片,仅发现B类照片,未发现新插入的A类照片。

事务的隔离性

start transaction;
## 插入id=1数据
INSERT INTO 
# 当前会话内 查询id=1的数据可见
select * from ? where id='1';
commit ;
# 其他事务查询id=1的数据可见
select * from car_picture where id='1'; 

因此,在同一个事务内,删除数据a,再插入数据b,查询得到的应该是b,但就结果没有拿到b. 导致在同步第三方数据同台时出现少数据的线上问题。

问题分析

 

事务的传播行为

 会不会是因为插入行为在另一事务内?

  • 查阅代码发现事务传播行为为默认属性:required ,也就是不会创建新事务,而是加入调用者的事务。

 

  • 况且即使发起新事务,只要事务B提交,就能查到数据b(在没用使用多线程的情况下,事务的隔离级别默认为readCommited) .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值