事务未提交 而redis 提前解锁,导致的事务不一致的问题
事务未提交 而redis 提前解锁,导致的事务不一致的问题:
症状介绍:
线程A 获取补贴计算锁,修改 subsidy_amount = 10 修改为 subsidy_amount = 20,未提交事务,但释放锁;
线程B 获取补贴计算锁,根据 补贴金额 subsidy_amount + 报销费用金额(300),计算单据总金额,期望值 320,实际结果 310
根因分析:
线程A 事务未提交就解锁,导致线程B 没有及时获取到更新后的值,使用了旧值进行计算单据总金额
解决方法:
- 解锁需在事务提交之后
if (TransactionSynchronizationManager.isActualTransactionActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCompletion(int status) {
unlock(lock); // 解锁操作
}
});
} else {
unlock(lock); // 解锁操作
}
- 写在同一个方法内,保证计算更新逻辑在同一个事务内可见

浙公网安备 33010602011771号