You are currently viewing 在事务完成后释放分布式锁

在事务完成后释放分布式锁

  • Post author:
  • Post category:Java

这里使用了Redisson实现的分布式锁,基本使用方式见官方文档

常规的逻辑是在执行业务逻辑前获取锁,在执行完成后释放锁

@Transactional(rollbackFor = Exception.class)
public void demo(){
    RLock lock = redisson.getLock("anyLock");
    try {
        if (lock.tryLock()){
            // 业务逻辑
        }
    } finally {
        if(lock.isHeldByCurrentThread()){
            lock.unlock();
        }
    }
}

在使用注解式事务时,这么写存在问题:释放锁时事务还未提交。

虽然可以手动将解锁的代码提取到事务外,但不算一个好的解决方案,合理的方式是使用TransactionSynchronization的事务钩子方法:

@Transactional(rollbackFor = Exception.class)
public void demo(){
    RLock lock = redisson.getLock("anyLock");
    try {
        if (lock.tryLock()){
            // 业务逻辑
        }
    } finally {
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter()                        {
            @Override
            public void afterCompletion(int status) {
                if(lock.isHeldByCurrentThread()){
                    lock.unlock();
                }
            }
        });
    }
}

Max

Run Forrest,run!