› 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
U87
V2EX  ›  MySQL

mysql 并发更新某个字段引发的问题和思考

  •  
  •   U87 · Nov 1, 2022 · 3122 views
    This topic created in 1423 days ago, the information mentioned may be changed or developed.

    mysql 并发更新某个字段(调一次接口,数据库里的 click 字段加一),用 wrk 并发测试工具测试, -t 10 -c 500 -d 30s ,最后 30 秒大概 3000 个请求,我理解 click 应该增加了 3000 ,但实际只增加了几十。 另外说一下,先查询再 update 的。查询的时候用了 with_for_update()

    12 replies  •  2022-11-02 11:31:49 +08:00
    linauror
        1
    linauror  
       Nov 1, 2022
    直接 update xxx set click = click + 1 where id = xxx 呢
    pota
        2
    pota  
       Nov 1, 2022   ❤️ 2
    你 select 大量查询拿到了同一个基数啊。+1 都是一个数
    U87
        3
    U87  
    OP
       Nov 1, 2022
    @pota 不是吧,我 select 的时候用了 for update
    kele1997
        4
    kele1997  
       Nov 1, 2022
    for update 可以防止并发读。
    第一个请求假如读到 1 ,程序里面准备发送 update xxx set click = 2,但是还未发送。
    第二个请求此时也读取 mysql ,读到的结果也是 1 , 程序里面也准备发送 update xxx set click = 2
    最后等两条 sql 都运行完了,click 有可能只加了一次

    正常的操作应该是读和写在一个事务里面吧,单行 sql 直接 update 肯定是一个事务。
    但是拆开 select 和 update 有可能不在一个事务中吧
    zjj19950716
        5
    zjj19950716  
       Nov 1, 2022
    考虑 redis 的 incr 吗
    wushigejiajia01
        6
    wushigejiajia01  
       Nov 1, 2022
    上锁呗
    F281M6Dh8DXpD1g2
        7
    F281M6Dh8DXpD1g2  
       Nov 1, 2022
    你的隔离级别是啥
    盲猜你得改成 rc
    optional
        8
    optional  
       Nov 1, 2022
    不会没开启事务吧,另外楼上说的对,得改成 rc 级别 mysql 默认记得是 rr
    thinkershare
        9
    thinkershare  
       Nov 1, 2022
    加读写锁, 或者使用版本戳,乐观并发并发冲突后抛异常重试。
    simple2025
        10
    simple2025  
       Nov 1, 2022
    直接用 redis 锁吧,mysql 搞那么复杂干嘛?
    xuanbg
        11
    xuanbg  
       Nov 2, 2022
    1 楼已经给了正确答案
    U87
        12
    U87  
    OP
       Nov 2, 2022
    @optional 用的 ORM,事务开启的,找到问题所在了。原来我们的测试库引擎是 myISAM 。。。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2555 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 08:16 · PVG 16:16 · LAX 01:16 · JFK 04:16
    ♥ Do have faith in what you're doing.