Mysql 主从下,行锁还有效吗

2022-08-25 15:19:43 +08:00
 frank1256

想用 mysql 的行锁当分布式锁,环境是一主二从,主负责写,从负责读. 行锁依然有效吗?for update 会阻塞所有客户端的请求吗?

如果是双主的情况也是一样吗?

没咋试过...之前一直都是单节点

2312 次点击
所在节点    程序员
14 条回复
frank1256
2022-08-25 15:28:04 +08:00
我理解,应该不行吧,毕竟读是从节点上读的,中间同步一定有时效性. 除非加锁同步, 那样性能不就很低下了?
JasonLaw
2022-08-25 15:38:20 +08:00
@frank1256 你可以用伪代码描述一下你是怎么实现分布式锁的。
frank1256
2022-08-25 15:53:27 +08:00
@JasonLaw append 了
cloudzhou
2022-08-25 15:59:16 +08:00
select * from task for update;
的话,本质是一个写操作,中间件也会走主,这样起到行锁的作用
wangnimabenma
2022-08-25 16:11:34 +08:00
我感觉可以 分布式锁的几个问题 死锁 排它 锁等待 误解锁好像都解决了,如果是用的读写分离的中间件看下 for update 的流量是不是指定到读库?
winglight2016
2022-08-25 16:21:17 +08:00
mysql 主从是通过 binlog ,查询锁是不会同步的,lz 这句 sql 必须连接到主库才能成功锁住
frank1256
2022-08-25 16:22:28 +08:00
@winglight2016 我是这么理解的, for update 确实如 4 喽说的,是写操作,原则上是会锁住的. 但我现在没环境去试一下...
cheng6563
2022-08-25 16:32:14 +08:00
读写分离时,中间件会把事务内的所有语句定位到主库。
wupher
2022-08-25 16:59:33 +08:00
好奇,即使能做这样不怕影响数据库性能吗?毕竟大部分数据存储还是会使用 DB 的。

为何不简单用一个 Redis  甚至  Zookeeper  来解决分布式加锁的问题?
frank1256
2022-08-25 17:02:18 +08:00
@wupher 没有其他中间件,整个项目只有 jdk 和 mysql
Chinsung
2022-08-25 17:48:55 +08:00
一主多从,写操作肯定是到主节点的,从库是 binlog 同步结果,有延迟但是有顺序,所以只有主库上可能出现这个行锁的竞争,这个行锁本质就是主节点生效而已
两主,mysql 两主一般只是通过代理做自动切换而已,我印象里并没有同时支持写,也不存在这个问题,本质和单主一样
多主的话,本质上是个分布式事务问题,mysql 本身对这个问题的支持约等于 0
hoopan
2022-08-26 08:54:23 +08:00
一主多从,for update 会走主库,行锁是有效的,肯定会阻塞所有请求的。双主不清楚,没搞过。
zzhpeng
2022-08-26 13:42:10 +08:00
@Chinsung 先 for update ,再写操作呢,不会一个从,一个主库吗
frank1256
2022-08-26 15:38:09 +08:00
@zzhpeng for update 相当于写, 要加锁的,只会在主库上执行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/875336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX