在一些场景,需要实现阻塞锁,就是可以排队等待的锁。比如API调用的扣费服务中,调用不能失败 ,所以不能使用非阻塞锁,非阻塞锁的话,直接return抢占锁失败了。这个时候的扣费逻辑,为了避免重复消费等问题,就需要实现原子性。查询费用,扣费,更新三个动作需要实现最小化,不可分割化。
简单的场景可以使用MySQL的Update原子性实现。这里就使用Redisson的阻塞等待锁实现。
把扣费相关的业务放在锁内,一个请求执行完了,释放锁,下一个请求才能进来。
本文只提供关键代码。
注入RedissonClient
1 | import org.redisson.Redisson; |
阻塞等待锁使用
1 | // 增加redisson分布式阻塞锁,可实现顺序等待 |