PHP脚本中止,导致MySQL事务失败,整个应用程序锁定一段时间

PHP脚本中止,导致MySQL事务失败,整个应用程序锁定一段时间,php,mysql,ajax,transactions,rollback,Php,Mysql,Ajax,Transactions,Rollback,我在MySQL数据库中使用事务以及Ajax,脚本超时时遇到了一些问题。下面是发生的情况的概述: 页面上的Ajax脚本向服务器发出请求。 服务器接收请求;脚本启动MySQL事务。 Ajax脚本设置为两秒后超时;超时;通知服务器中止请求。 服务器脚本死亡;交易悬而未决。 MySQL通知事务已挂起;按预期的方式回滚,但不是在一群客户变得不高兴之前,因为桌子被锁定了半分钟,他们无法访问网站。 怎么办 我想服务器脚本只需要比给定的两秒钟多一点的时间,所以我在每个页面上调用了ignore\u user\u

我在MySQL数据库中使用事务以及Ajax,脚本超时时遇到了一些问题。下面是发生的情况的概述:

页面上的Ajax脚本向服务器发出请求。 服务器接收请求;脚本启动MySQL事务。 Ajax脚本设置为两秒后超时;超时;通知服务器中止请求。 服务器脚本死亡;交易悬而未决。 MySQL通知事务已挂起;按预期的方式回滚,但不是在一群客户变得不高兴之前,因为桌子被锁定了半分钟,他们无法访问网站。 怎么办

我想服务器脚本只需要比给定的两秒钟多一点的时间,所以我在每个页面上调用了ignore\u user\u abort,然后调用register\u shutdown\u函数,如果客户机实际上已经中止,则显式回滚事务


这是个好计划吗?是否有其他选择?

寄存器关闭功能本身甚至是一个很好的解决方案。尝试删除ignore_user_abort,以便脚本知道用户何时或是否中止加载


我还可能让脚本有超过2秒的超时时间,看看这是否有帮助。

您是否使用持久数据库连接,即:使用mysql\u pconnect?即使没有PHP脚本在运行,它们也会使web服务器中的连接保持活动状态。因此,当脚本异常关闭时,在脚本运行期间获取的任何事务/锁将在该持久连接中保持活动状态


即使您的脚本在mysql_关闭后正常清理,任何异常终止都会使持久连接中断。直到连接从池中重新使用并被其他脚本正确关闭。

我去阅读了更多关于mysql\u pconnect的内容,发现在我多年使用它之后,它真的不适合我的情况-使用开放的事务,数据库托管在与web服务器相同的机器上,还有其他一些原因。谢谢你的建议!谢谢你的建议;您知道ignore\u user\u aborttrue是否仍然允许脚本本身通过connection\u aborted或connection\u status处理用户中止?对于大多数AJAX操作,我希望避免超过2秒的超时,因为它们很简单——例如,将项目添加到购物车中——我更希望软件报告“服务器速度慢”错误,而不是让界面挂起5到10秒,让用户怀疑到底出了什么问题。”当然,在UI环境中,“速度感知”通常是可取的。是的,即使您正在使用“忽略用户”或“中止”,仍然可以检查连接状态。如果是这样,您至少必须向客户端发送一些信息,以便连接状态可以查看客户端是否仍在侦听。