基于数据库悲观锁的分布式锁

基于synchronized和ReentrantLock锁都只限于在单体架构中使用,当出现分布式跨JVM的情况,需要使用分布式锁来解决跨JVM的问题。

解决方法

通过select …for update 访问同一条数据
for update 锁定数据,其他线程只能等待

步骤

1.select @@autocommit;查询若是1,则需要设置为0,否则会话会自动提交事务,将两个事务autocommit都设置为0。
在这里插入图片描述
2.在第一个会话进行查询,再第二会话进行查询,发现无法查询出数据,这是由于第一个会话还未commit。
当第一个会话进行commit后,第二个会话才可以查询出数据。
在这里插入图片描述

注:当不加for update去查询,是可以查询数据的。因为加锁只是锁定这条数据,因此不能修改这条数据,也不能再给这条数据加锁。检索是不影响的。

所以使用该特性实现分布式锁。
在这里插入图片描述
开启两个服务,进行测试
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_31776219/article/details/113816449