使用分布式锁时,分布式锁加在事务外面还是里面,有什么区别?
典型回答 在使用分布式锁与事务注解(如 Spring 的 @Transactional)一起时,分布式锁的位置(锁在事务外还是事务内)对于程序的行为和事务的一致性具有重要的影响。 其实这个问题本质就是锁的粒度和事务的粒度之间的关系,到底谁应该更大一些? 锁的粒度大于事务粒度 即在加锁之后,再调用一个带事务注解的方法,伪代码如下: 1 2 3 4 5 6 7 8 9 lock.lock(); try { @Transactional public void method() { // 事务性操作 } } finally { lock.unlock(); } 这个方式的优点是事务的时长不受锁的影响。一般来说我们的分布式锁都是通过Redis等实现的,这就涉及到一个远程调用,那么就会导致拖长事务的问题。 ✅为啥不要在事务中做外部调用? 缺点就是锁的时间会更长,跨越了整个事务。因为锁的时间更长了,那么整个系统的吞吐量也就会更低了。 事务的粒度大于锁粒度 即在开启事务之后,再进行加锁,伪代码如下: 1 2 3 4 5 6 7 8 9 @Transactional public void method() { lock.lock(); try { // 事务性操作 } finally { lock.unlock(); } } 这个方式的优点是锁的时长比较短,并发度会更高一些。 ...