想用 mysql 的行锁当分布式锁,环境是一主二从,主负责写,从负责读. 行锁依然有效吗?for update 会阻塞所有客户端的请求吗?
如果是双主的情况也是一样吗?
没咋试过...之前一直都是单节点
1
frank1256 OP 我理解,应该不行吧,毕竟读是从节点上读的,中间同步一定有时效性. 除非加锁同步, 那样性能不就很低下了?
|
4
cloudzhou 2022-08-25 15:59:16 +08:00
select * from task for update;
的话,本质是一个写操作,中间件也会走主,这样起到行锁的作用 |
5
wangnimabenma 2022-08-25 16:11:34 +08:00
我感觉可以 分布式锁的几个问题 死锁 排它 锁等待 误解锁好像都解决了,如果是用的读写分离的中间件看下 for update 的流量是不是指定到读库?
|
6
winglight2016 2022-08-25 16:21:17 +08:00
mysql 主从是通过 binlog ,查询锁是不会同步的,lz 这句 sql 必须连接到主库才能成功锁住
|
7
frank1256 OP @winglight2016 我是这么理解的, for update 确实如 4 喽说的,是写操作,原则上是会锁住的. 但我现在没环境去试一下...
|
8
cheng6563 2022-08-25 16:32:14 +08:00
读写分离时,中间件会把事务内的所有语句定位到主库。
|
9
wupher 2022-08-25 16:59:33 +08:00
好奇,即使能做这样不怕影响数据库性能吗?毕竟大部分数据存储还是会使用 DB 的。
为何不简单用一个 Redis 甚至 Zookeeper 来解决分布式加锁的问题? |
11
Chinsung 2022-08-25 17:48:55 +08:00
一主多从,写操作肯定是到主节点的,从库是 binlog 同步结果,有延迟但是有顺序,所以只有主库上可能出现这个行锁的竞争,这个行锁本质就是主节点生效而已
两主,mysql 两主一般只是通过代理做自动切换而已,我印象里并没有同时支持写,也不存在这个问题,本质和单主一样 多主的话,本质上是个分布式事务问题,mysql 本身对这个问题的支持约等于 0 |
12
hoopan 2022-08-26 08:54:23 +08:00
一主多从,for update 会走主库,行锁是有效的,肯定会阻塞所有请求的。双主不清楚,没搞过。
|