1.背景
系统中存有用户的虚拟资金,用户可在金额到达一定的额度后提起提现申请,今日运营反馈部分用户在使用APP提现时页面空白
2.分析
前期分析认为是APP端处理异常,或部分手机不兼容,深入分析后发现是APP端无法处理未知错误信息导致页面空白,根本的原因是用户发起提现申请时,系统处理资金扣除的过程中抛了异常,无法正常锁定用户钱包的金额。
3.锁定
通过检查日志,最终确认在钱包服务中进行金额扣除时,使用了redis进行分布式锁,并使用spring-redis进行的操作,在执行tryLock时,抛出异常
错误代码:
Lock lock = registry.obtain("lock-" + transferId);
if (lock.tryLock()) {
....
}else{
throw new Exception();
}
正确的代码写法:
Lock lock = registry.obtain("lock-" + transferId);
if (lock.tryLock()) {
try{
....
}finally{
lock.unlock();
}
}else{
throw new Exception();
}
四.排查
为何只有部分用户会出现锁定失败的现象?而部分用户又可以成功?还有部分用户在锁定失败几次后,再发起又成功了?<