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

MYSQL UPDATE 在很短的时间内更新相同的语句,就会有告警,导至事务失败,有没有人遇到这问题?

  •  
  •   Alucns · Aug 26, 2025 · 5108 views
    This topic created in 401 days ago, the information mentioned may be changed or developed.
    MYSQL UPDATE 在很短的时间内更新相同的语句,就会有告警,导至事务失败,有没有人遇到这问题?

    如:UPDATE `api_wallet` SET `credits`=`credits`+'1087.77', `cost`=`cost`+'151.23' WHERE `uid`='12';
    Rows matched: 1 Changed: 1 Warnings: 1
    mysqli_warning Object
    (
    [message] => Data truncated for column 'credits' at row 1
    [sqlstate] => HY000
    [errno] => 1265
    )
    22 replies  •  2025-08-28 17:48:03 +08:00
    JoeJoeJoe
        1
    JoeJoeJoe  
       Aug 26, 2025 via iPhone   ❤️ 1
    看看 credits 的定义
    Alucns
        2
    Alucns  
    OP
       Aug 26, 2025
    @JoeJoeJoe 不是这个问题呢,所有字段结构是 decimal(16,2)
    Alucns
        3
    Alucns  
    OP
       Aug 26, 2025
    MYSQL 版本 8.4.0
    Alucns
        4
    Alucns  
    OP
       Aug 26, 2025
    MYSQL 版本 8.4.5
    hefish
        5
    hefish  
       Aug 26, 2025   ❤️ 1
    我猜想是 文本转数字损失精度的问题
    realpg
        6
    realpg  
       Aug 26, 2025   ❤️ 1
    如果不是手写的代码 就换个靠谱点的 orm
    现在高版本 MYSQL 的默认开启的严格模式可能都没法运行
    JoeJoeJoe
        7
    JoeJoeJoe  
       Aug 26, 2025 via iPhone   ❤️ 1
    @Aluhao 小数位扩大一下验证试试?
    jorneyr
        8
    jorneyr  
       Aug 26, 2025   ❤️ 1
    也是 MySQL 8 ,遇到过,同一个事务里多次更新同一条记录的同一个 int 字段报错 (延时一下就不报错了)。
    phpfpm
        9
    phpfpm  
       Aug 26, 2025   ❤️ 1
    最佳实践是别用 mysql 做算术题,你就当他是 kv 你 update 一个主键就行。

    先查出来,加个锁,开个事务,提交数据

    mysql 的 cpu 很值钱,你程序的 cpu 不值钱

    否则你高频做整个事情 mysql 内部自己有悲观锁什么的不整死你才怪
    clarkethan
        10
    clarkethan  
       Aug 26, 2025
    有没有查过日志,引起警告的语句具体是什么,有没有可能你在有些语句里面,传入了不符合数据库字段需要的值,比如 1087.770
    Alucns
        11
    Alucns  
    OP
       Aug 26, 2025
    感谢大家回复,我测试看看,谢谢!
    Alucns
        12
    Alucns  
    OP
       Aug 26, 2025
    @clarkethan 告警就是这个 Data truncated for column 'credits' at row 1
    lovelylain
        13
    lovelylain  
       Aug 26, 2025 via Android
    credits 没有 not null default ,update 前值为 null ?
    rekulas
        14
    rekulas  
       Aug 26, 2025
    不是很明显的溢出问题么? 你先改为 decimal(16,6) 测测
    xiangyuecn
        15
    xiangyuecn  
       Aug 27, 2025
    @phpfpm #9 查出来再加锁???😂 事务是这么玩的嘛 干脆不要事务得了
    Alucns
        16
    Alucns  
    OP
       Aug 27, 2025
    @hefish 经过测试就是 文本转数字损失精度的问题
    phpfpm
        17
    phpfpm  
       Aug 27, 2025
    @xiangyuecn 第一遍查总得大概齐看下有没有余额吧,完成一些不需要写表的业务逻辑。

    至于在事务里面要不要再次查或者 select for update 随你

    (我就这么一说不要认真当伪代码了 hhh
    spritecn
        18
    spritecn  
       Aug 27, 2025
    @phpfpm 复议 9 楼..把这一行的操作逻辑独立出来,轻事务,并加锁
    dajj
        19
    dajj  
       Aug 27, 2025
    Data truncated for column 'credits' at row 1 你设置的值超过字段精度了
    Alucns
        20
    Alucns  
    OP
       Aug 27, 2025
    UPDATE `api_wallet` SET `credits`=`credits`+'1087.77', `cost`=`cost`+'151.23' WHERE `uid`='12';
    估计是这个值'1087.77' 被转换成 1087.769999999
    vone
        21
    vone  
       Aug 28, 2025
    MySQL 好像在事务未提交前写入的数据,如果你再读取的话好像不一定保证是 decimal(16,2)。
    ca2oh4
        22
    ca2oh4  
       Aug 28, 2025
    说了金额不要存小数
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2309 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 06:03 · PVG 14:03 · LAX 23:03 · JFK 02:03
    ♥ Do have faith in what you're doing.