V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BBCCBB
V2EX  ›  程序员

[MySQL] 如何在 mysql5.7 版本实现 8.0 版本的 for update skip locked 功能?

  •  
  •   BBCCBB · 2021-03-16 18:58:57 +08:00 · 1248 次点击
    这是一个创建于 1351 天前的主题,其中的信息可能已经有所发展或是发生改变。

    万能的 v 友, 看到 mysql8 版本下加了针对 lock 的 no wait 和 skip locked 功能..

    比如:

    create table A (
      id int primariy key;
    )
    
    insert into A values (1), (2), (3);
    
    

    现在有两个线程 t1, t2.

    t1 执行

    select * from A where id > 0 for update limit 1;
    

    t2 执行

    select * from A where id > 0 for update limit 1;
    

    现在 t2 会在 id=1 的地方等待 t1 释放 id=1 的锁. 而如果 t2 改成这样

    select * from A where id > 0 for update skip locked limit 1;
    

    那么 t2 会跳过 id=1 转而针对 id=2 加锁.

    但是这个功能是 8.0.1 才加上的

    请问大佬们在 mysql5.7 如何实现这种功能呢? 或者说在没有skip locked feature 的数据库上有没有可能通过设计上来实现这个功能呢?

    4 条回复    2021-03-17 15:08:24 +08:00
    BBCCBB
        1
    BBCCBB  
    OP
       2021-03-16 22:25:42 +08:00
    🐶
    killergun
        2
    killergun  
       2021-03-17 08:17:38 +08:00
    改源码
    BBCCBB
        3
    BBCCBB  
    OP
       2021-03-17 08:28:54 +08:00
    @killergun 你🐮🍺, 还有其他办法吗
    BBCCBB
        4
    BBCCBB  
    OP
       2021-03-17 15:08:24 +08:00
    捞捞, 没办法就算了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4972 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:50 · PVG 17:50 · LAX 01:50 · JFK 04:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.