当前位置:Gxlcms > 数据库问题 > 【转】记录PHP、MySQL在高并发场景下产生的一次事故

【转】记录PHP、MySQL在高并发场景下产生的一次事故

时间:2021-07-01 10:21:17 帮助过:2人阅读

对比当前道具数量这一步逻辑,但是加入第一次的扣道具的操作把道具扣光了,或者扣的不够第二次继续扣了,想想会发生什么样的情况!

坑爹了!第二次会把道具数量扣为负数。

但是这依然不能解释这42亿的溢出那里来的!哎,祸不单行的古语再次应验了,我们的count字段的数据类型是Unsigned int,坑爹的MySQL,假如字段是Unsigned int,然后输入了一个负数,它就会让这个数字变为42亿这个巨大的数值。

看明白了吧!这42亿就是这么来的,坑啊!

解决方案的话,可以在update的sql改成这样

<?php
$update = "UPDATE `user` SET `count`=(CASE WHEN `count`<={$consume_props_count} THEN 0 ELSE `count`-{$consume_props_count} END) WHERE `userid`=123456"
?>

这样,就不会在扣成负数了,另外以防万一,还要将Unsigned int的字段类型,改为int

 

 

摘自:http://h5b.net/php-mysql-high-concurrency-accident

【转】记录PHP、MySQL在高并发场景下产生的一次事故

标签:

人气教程排行