场景:合同数据财务1和财务2都是可以看到的,但是一个合同只要生生一份账单就行,好巧不巧,在同一时刻,财务一和财务二同时对A按下了生产账单按钮。那么就产生了两份账单。
同事为了解决这个问题使用了redis,我看了看他的代码,他使用aop 只对有特定注解的进行代理。在代理前 先看不能不能根据合同id获取到值,能获取就说明没有被占用锁,不能获取说明锁占用了,这个账单已经在生成了。在after 他直接删除锁。
说到锁:我先想到的是 sync ,reentrantlock,redisLock.
reentratLock 相比sync 是可以去尝试获取锁。当获取不到锁可以做其他的操作。比如上面的场景因为账单只能生成一个,这个时候不能使用sync。因为当财务1的线程1生成账单后,线程2也会继续执行,然后也生成了一个账单,没有达到预期的效果。
redislock 相比reentrantLock;reentrantLock只能在一个服务里面起作用。账单服务有两个,使用的负载均衡算法是平均算法。那么财务一和财务2的请求刚好请求在不同的服务里面,那么就生成了两个账单。 使用redisLock的话,两个服务也是去同一个redis里面查看有么有值,来判断账单是否在生成。