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

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

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

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

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

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

(我就这么一说不要认真当伪代码了 hhh
spritecn
2 天前
@phpfpm 复议 9 楼..把这一行的操作逻辑独立出来,轻事务,并加锁
dajj
2 天前
Data truncated for column 'credits' at row 1 你设置的值超过字段精度了
Aluhao
2 天前
UPDATE `api_wallet` SET `credits`=`credits`+'1087.77', `cost`=`cost`+'151.23' WHERE `uid`='12';
估计是这个值'1087.77' 被转换成 1087.769999999

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1155131

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX