这里使用了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();
}
}
});
}
}