我在javascript中有一个单页网站。
为简化一切,将三种类型的http请求发送到服务器
/action/status/
/action/csv_process/
/action/status_pid/
每隔30秒,/action/status/
请求就会发送到服务器。请求中没有太多事情发生。您可以在下面看到在请求中执行的所有写入mysql查询
2017-01-12 18:37:03 2 --- REQUEST START: action status
2017-01-12 18:37:03 2 UPDATE `log_login` SET time_active=1387 WHERE id=78360
2017-01-12 18:37:03 2 BEGIN
2017-01-12 18:37:03 2 COMMIT
2017-01-12 18:37:03 2 --- REQUEST END 0.076473951339722
然后用户可以上传CSV文件。上传文件后,用户可以选择文件的处理方式。以下/action/csv_process/
请求通常需要一些时间才能完成,因此每3秒向服务器发送一个/action/status_pid/
请求以获得百分比(0-100)的进度
一切正常。 /action/status_pid/
请求以3秒的间隔运行,并在/action/csv_process/
正在处理时返回响应,但只要/action/status/
被发送到服务器,一切都会锁定,直到/action/csv_process/
为止完成
为什么/action/status/
会锁定所有内容?
每个请求都使用mysql事务运行,所有表都是InnoDB
即使我没有在所有并发请求中使用session_write_close()
,也应该等到当前请求完成。但/action/status/
处于待处理状态,直到数据处理请求完成并锁定所有其他待处理请求