大佬们, mysql 在加排他锁失败时可以不阻塞吗?

2021-07-28 13:01:28 +08:00
 jie170601

我有这样一个需求,使用 mysql 在加锁失败时立即返回空集,而不是阻塞等待。

需求引伸一下,就是 mysql 在 select 的时候可不可以过滤掉被锁定的行,只返回没锁的行?

因为搜索能力有限,只找到了一条相关的内容: https://stackoverflow.com/questions/20091527/select-only-unlocked-rows-mysql

里面提到 mysql8 有 skip locked 关键字,但是我用的 mysql7,而且不太好更换数据库,所以想问问大佬们 mysql7 有办法实现这个需求吗?

1577 次点击
所在节点    MySQL
6 条回复
sun522198558
2021-07-28 13:25:30 +08:00
可以把 innodb_lock_wait_timeout 设置短一点
sunnyday123
2021-07-28 17:33:51 +08:00
有很多更新操作吗(update,delete,insert)?的情况下才会有排它锁,这种情况下搞个主从,select 请求都放到从库比较好
jie170601
2021-07-28 21:49:30 +08:00
@sunnyday123 就是单纯的 select... from... for update,然后每次查的时候想把锁住的行给过滤掉,并且不阻塞直接返回结果
cjp05
2021-07-29 09:15:46 +08:00
这个需求怎么感觉有点特殊,改 db 配置感觉风险好大,还不如外层加个 redis 锁(但说不定 mysql 有这种实现我不知道)
jie170601
2021-07-29 10:01:18 +08:00
@cjp05 是的有点特殊,实际上改了业务实现逻辑绕开了这个牛角尖,如果实在绕不过去我暂时想到两种方法:

1. 专门装个 8 的数据库或者 PostgreSQL 等其它数据库用来处理这一类问题
2. 不用数据库的锁,像外层加 redis 锁等
encro
2021-07-30 22:31:13 +08:00
很好奇什么场景需要 lock 很久,这个做法本身对吗?不会导致连接数超过吗?

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

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

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

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

© 2021 V2EX