基于synchronized和ReentrantLock锁都只限于在单体架构中使用,当出现分布式跨JVM的情况,需要使用分布式锁来解决跨JVM的问题。
解决方法
通过select …for update 访问同一条数据
for update 锁定数据,其他线程只能等待
步骤
1.select @@autocommit;查询若是1,则需要设置为0,否则会话会自动提交事务,将两个事务autocommit都设置为0。
2.在第一个会话进行查询,再第二会话进行查询,发现无法查询出数据,这是由于第一个会话还未commit。
当第一个会话进行commit后,第二个会话才可以查询出数据。
注:当不加for update去查询,是可以查询数据的。因为加锁只是锁定这条数据,因此不能修改这条数据,也不能再给这条数据加锁。检索是不影响的。
所以使用该特性实现分布式锁。
开启两个服务,进行测试