缘由
在排查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 '
';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 '
';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
解决
只能优化代码速度,把耗时的程序部分放到单独的队列里面除了