http的499状态码是什么鬼?

本文分析了在MySQL中因用户重复提交导致的锁表问题,详细解释了问题出现的原因,即长时间运行的事务导致用户刷新或重新提交请求。通过模拟实验验证了这一现象,并提出了将耗时操作放入队列的解决方案。

缘由

在排查mysql锁表的情况时,发现总是出现两次相邻的同样请求。
而且第一次的事务基本都成功,第二次的失败
继续分析得出,因为代码时间比较长,超过了30s,用户无法忍受。
刷新了页面或者关闭重新提交同样的修改数据。但第一次的事务还在进行中。
结果就出现了,为了验证自己的想法,对499进行了模拟

SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction  xxxxxxxx

定义

ngx_null_string, /* 499, client has closed connection */

模拟

我做了一个php的页面,代码很简单

echo '<pre>';
print_r($_POST);
exit;

产生的日志

127.0.0.1 - - [31/Mar/2020:14:06:15 +0800] "GET /test/1.php HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36" "-" 0.131

加上sleep后

sleep(20)
echo '<pre>';
print_r($_POST);
exit;

然后请求页面后,2秒后关闭页面
情况出现

127.0.0.1 - - [31/Mar/2020:14:10:19 +0800] "GET /test/1.php HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36" "-" 3.861

解决

只能优化代码速度,把耗时的程序部分放到单独的队列里面除了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值