1

我在 MySQL 数据库中使用事务以及 Ajax,并且遇到了脚本超时的问题。所以,这里是发生的事情的概要:

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

该怎么办?

我想服务器脚本只需要比给定的两秒多一点的时间,所以我ignore_user_abort()在每个页面上调用,然后register_shutdown_function()如果客户端实际上已中止,则调用以显式回滚事务。

这是一个好计划吗?有替代方案吗?

4

2 回答 2

0

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

即使您的脚本通常在使用 后自行清理mysql_close(),任何异常终止都会使该持久连接保持正常。并一直保持到连接从池中重新使用并被其他脚本正确关闭。

于 2010-06-22T02:49:19.227 回答
0

register_shutdown_function() 本身甚至是一个很好的解决方案。尝试删除 ignore_user_abort() 以便脚本知道用户何时(或是否)中止加载。

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

于 2010-06-21T22:47:16.477 回答