我彻底看愣了,现在才知道MySQL还能实现分布式锁?

本文探讨了在微服务架构中单体应用锁的局限性,并介绍了分布式锁的概念和设计思路。通过示例展示了如何基于数据库的悲观锁实现分布式锁,通过控制事务和`SELECT ... FOR UPDATE`来确保锁的效果。同时指出了数据库锁在高并发时可能对数据库造成压力,并建议与业务数据库分开。最后提到Redis和Zookeeper也是常用的分布式锁实现方式,但将在后续文章中分享。
摘要由CSDN通过智能技术生成

前言

之前的文章中通过电商场景中秒杀的例子和大家分享了单体架构中锁的使用方式,但是现在很多应用系统都是相当庞大的,很多应用系统都是微服务的架构体系,那么在这种跨jvm的场景下,我们又该如何去解决并发。

单体应用锁的局限性

在进入实战之前简单和大家粗略聊一下互联网系统中的架构演进。

在互联网系统发展之初,消耗资源比较小,用户量也比较小,我们只部署一个tomcat应用就可以满足需求。一个tomcat我们可以看做是一个jvm的进程,当大量的请求并发到达系统时,所有的请求都落在这唯一的一个tomcat上,如果某些请求方法是需要加锁的,比如上篇文章中提及的秒杀扣减库存的场景,是可以满足需求的。但是随着访问量的增加,一个tomcat难以支撑,这时候我们就需要集群部署tomcat,使用多个tomcat支撑起系统。

在上图中简单演化之后,我们部署两个Tomcat共同支撑系统。当一个请求到达系统的时候,首先会经过nginx,由nginx作为负载均衡,它会根据自己的负载均衡配置策略将请求转发到其中的一个tomcat上。当大量的请求并发访问的时候,两个tomcat共同承担所有的访问量。这之后我们同样进行秒杀扣减库存的时候,使用单体应用锁,还能满足需求么?

之前我们所加的锁是JDK提供的锁,这种锁在单个jvm下起作用,当存在两个或者多个的时候,大量并发请求分散到不同tomcat,在每个tomcat中都可以防止并发的产生,但是多个tomcat之间,每个Tomcat中获得锁这个请求,又产生了并发。从而扣减库存的问题依旧存在。这就是单体应用锁的局限性。那我们如果解决这个问题呢?接下来就要和大家分享分布式锁了。

分布式锁

什么是分布式锁?

那么什么是分布式锁呢,在说分布式锁之前我们看到单体应用锁的特点就是在一个jvm进行有效,但是无法跨越jvm以及进程。所以我们就可以下一个不那么官方的定义,分布式锁就是可以跨越多个jvm,跨越多个进程的锁,像这样的锁就是分布式锁。

设计思路

由于tomcat是java启动的࿰

MySQL实现分布式锁可以通过以下几种方式: 1. 基于MySQL自带的行实现 可以通过在表中添一条记录来实现分布式锁。当一个客户端想获取时,可以向表中插入一条记录,如果插入成功则说明获取成功,否则获取失败。当客户端释放时,可以删除表中对应的记录。需要注意的是,由于MySQL自带的行只在当前连接中有效,因此需要在每个客户端中都执行相同的和解操作。 2. 基于MySQL的GET_LOCK和RELEASE_LOCK函数实现 MySQL提供了GET_LOCK和RELEASE_LOCK两个函数,可以用于实现分布式锁。当一个客户端想获取时,可以调用GET_LOCK函数,如果返回值为1则说明获取成功,否则获取失败。当客户端释放时,可以调用RELEASE_LOCK函数来释放。需要注意的是,由于GET_LOCK和RELEASE_LOCK函数是在MySQL服务器端执行的,因此可以实现跨连接的。 3. 基于ZooKeeper实现 可以利用ZooKeeper的临时节点实现分布式锁。当一个客户端想获取时,可以在ZooKeeper上创建一个临时节点,如果创建成功则说明获取成功,否则获取失败。当客户端释放时,可以删除对应的临时节点。由于ZooKeeper是一个高可用的分布式协调服务,因此可以保证分布式锁的可靠性和高可用性。 以上是几种实现MySQL分布式锁的方式,需要根据具体的应用场景和实际需求选择合适的方式实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值