› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
jie170601
V2EX  ›  MySQL

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

  •  
  •   jie170601 · Jul 28, 2021 · 2816 views
    This topic created in 1888 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    1. 专门装个 8 的数据库或者 PostgreSQL 等其它数据库用来处理这一类问题
    2. 不用数据库的锁,像外层加 redis 锁等
    encro
        6
    encro  
       Jul 30, 2021
    很好奇什么场景需要 lock 很久,这个做法本身对吗?不会导致连接数超过吗?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   862 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 20:38 · PVG 04:38 · LAX 13:38 · JFK 16:38
    ♥ Do have faith in what you're doing.