事务未提交 而redis 提前解锁,导致的事务不一致的问题

事务未提交 而redis 提前解锁,导致的事务不一致的问题:

症状介绍:

线程A 获取补贴计算锁,修改 subsidy_amount = 10 修改为 subsidy_amount = 20,未提交事务,但释放锁;
线程B 获取补贴计算锁,根据 补贴金额 subsidy_amount + 报销费用金额(300),计算单据总金额,期望值 320,实际结果 310

根因分析:
线程A 事务未提交就解锁,导致线程B 没有及时获取到更新后的值,使用了旧值进行计算单据总金额

解决方法:

  1. 解锁需在事务提交之后
            if (TransactionSynchronizationManager.isActualTransactionActive()) {
                TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                    @Override
                    public void afterCompletion(int status) {
                        unlock(lock); // 解锁操作
                    }
                });
            } else {
                unlock(lock); // 解锁操作
            }
  1. 写在同一个方法内,保证计算更新逻辑在同一个事务内可见
posted @ 2025-07-01 17:04  charler。  阅读(16)  评论(0)    收藏  举报