我有这样一个需求,使用 mysql 在加锁失败时立即返回空集,而不是阻塞等待。
需求引伸一下,就是 mysql 在 select 的时候可不可以过滤掉被锁定的行,只返回没锁的行?
因为搜索能力有限,只找到了一条相关的内容: https://stackoverflow.com/questions/20091527/select-only-unlocked-rows-mysql
里面提到 mysql8 有 skip locked 关键字,但是我用的 mysql7,而且不太好更换数据库,所以想问问大佬们 mysql7 有办法实现这个需求吗?
1
sun522198558 2021-07-28 13:25:30 +08:00 1
可以把 innodb_lock_wait_timeout 设置短一点
|
2
sunnyday123 2021-07-28 17:33:51 +08:00 1
有很多更新操作吗(update,delete,insert)?的情况下才会有排它锁,这种情况下搞个主从,select 请求都放到从库比较好
|
3
jie170601 OP @sunnyday123 就是单纯的 select... from... for update,然后每次查的时候想把锁住的行给过滤掉,并且不阻塞直接返回结果
|
4
cjp05 2021-07-29 09:15:46 +08:00 1
这个需求怎么感觉有点特殊,改 db 配置感觉风险好大,还不如外层加个 redis 锁(但说不定 mysql 有这种实现我不知道)
|
5
jie170601 OP @cjp05 是的有点特殊,实际上改了业务实现逻辑绕开了这个牛角尖,如果实在绕不过去我暂时想到两种方法:
1. 专门装个 8 的数据库或者 PostgreSQL 等其它数据库用来处理这一类问题 2. 不用数据库的锁,像外层加 redis 锁等 |
6
encro 2021-07-30 22:31:13 +08:00
很好奇什么场景需要 lock 很久,这个做法本身对吗?不会导致连接数超过吗?
|