› 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 · 5372 views
    This topic created in 438 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
    JoeJoeJoe
    Aug 26, 2025 via iPhone❤️1
    1
    看看 credits 的定义
    Alucns
    Alucns
    OP
    Aug 26, 2025
    2
    @JoeJoeJoe 不是这个问题呢,所有字段结构是 decimal(16,2)
    Alucns
    Alucns
    OP
    Aug 26, 2025
    3
    MYSQL 版本 8.4.0
    Alucns
    Alucns
    OP
    Aug 26, 2025
    4
    MYSQL 版本 8.4.5
    hefish
    hefish
    Aug 26, 2025❤️1
    5
    我猜想是 文本转数字损失精度的问题
    realpg
    realpg
    Aug 26, 2025❤️1
    6
    如果不是手写的代码 就换个靠谱点的 orm
    现在高版本 MYSQL 的默认开启的严格模式可能都没法运行
    JoeJoeJoe
    JoeJoeJoe
    Aug 26, 2025 via iPhone❤️1
    7
    @Aluhao 小数位扩大一下验证试试?
    jorneyr
    jorneyr
    Aug 26, 2025❤️1
    8
    也是 MySQL 8 ,遇到过,同一个事务里多次更新同一条记录的同一个 int 字段报错 (延时一下就不报错了)。
    phpfpm
    phpfpm
    Aug 26, 2025❤️1
    9
    最佳实践是别用 mysql 做算术题,你就当他是 kv 你 update 一个主键就行。

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

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

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

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

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