记一次线上并发问题
問(wèn)題背景:
最近因?yàn)榻?jīng)濟(jì)下滑,導(dǎo)致公司沒(méi)有以前那么多的借款人,借款金額少,投資人就需要搶。
以下代碼只是例子,不代表真實(shí)代碼。
public void updateTenderRealAmount(Long id){
xxx.update(id);
xxx.selectById(id);
// 一堆邏輯判斷
// 更新整個(gè)對(duì)象
xxx.update(xxx)
}
按照邏輯:
A事務(wù)先來(lái),B事務(wù)再來(lái),正常邏輯
A開(kāi)啟事務(wù),B等待
A提交,B進(jìn)入,B提交
事實(shí):
A進(jìn)方法,數(shù)據(jù)庫(kù)開(kāi)啟行鎖,
B進(jìn)方法,等待行鎖,A釋放行鎖,B更新
A 查詢 拿到B更新的數(shù)據(jù)
更新? 數(shù)據(jù)出錯(cuò)。
排查線上代碼,發(fā)現(xiàn)從Controller 調(diào)服務(wù) 不走事務(wù),
但是從服務(wù)直接調(diào)其他服務(wù)又會(huì)走事務(wù)
查詢問(wèn)題發(fā)現(xiàn),使用dubbo2.8.4 并不是官方發(fā)布,我們從2.8.4換成2.5.10
問(wèn)題解決
轉(zhuǎn)載于:https://juejin.im/post/5c7a0d41f265da2d9c3889d8
總結(jié)
- 上一篇: flask中的CBV和FBV
- 下一篇: 开发直播APP软件一定要了解的H.264