记一次线上并发问题

360 阅读1分钟

问题背景:

最近因为经济下滑,导致公司没有以前那么多的借款人,借款金额少,投资人就需要抢。

以下代码只是例子,不代表真实代码。


public void updateTenderRealAmount(Long id){

xxx.update(id);

xxx.selectById(id);

// 一堆逻辑判断

// 更新整个对象

xxx.update(xxx)

}

按照逻辑:

A事务先来,B事务再来,正常逻辑

A开启事务,B等待

A提交,B进入,B提交

事实:

A进方法,数据库开启行锁,

B进方法,等待行锁,A释放行锁,B更新

A 查询 拿到B更新的数据

更新  数据出错。


排查线上代码,发现从Controller 调服务 不走事务,

但是从服务直接调其他服务又会走事务


查询问题发现,使用dubbo2.8.4 并不是官方发布,我们从2.8.4换成2.5.10

问题解决