两个并发连接/请求锁定

时间:2017-01-12 17:52:45

标签: php mysql nginx

我在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/处于待处理状态,直到数据处理请求完成并锁定所有其他待处理请求

1 个答案:

答案 0 :(得分:1)

如果您使用会话,则可能会锁定一个请求,直到您释放会话为止。在不再需要会话后尝试呼叫 session_write_close