事故描述
某商品的照片分两种类型: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) .