PHP& MySQL InnoDB:插入或更新后数据不可用

时间:2013-04-06 05:58:17

标签: php mysql innodb

我刚从MyISAM表切换到InnoDB,因为行锁定似乎比表锁定更好。

问题是,现在我以前做的很多事情都不起作用。

例如,我有一个脚本根据用户的浏览历史记录向用户推荐项目。这是通过将行插入或更新到推荐表中来完成的。建议的实际计算是通过SQL语句完成的。因此,有时我正在执行推荐语句,然后立即(在相同的PHP脚本中)请求结果,以便可以在那里向用户显示。使用MyISAM,这非常有效,但是使用InnoDB时,它有时会返回旧的结果,或者没有结果(如果以前没有结果)。

此外,我还有一个充当队列的表。要使用它,我执行并更新,然后选择此更新的结果。它再次适用于MyISAM,但不适用于InnoDB。

在某些情况下,如何确保立即插入或更新行?在其他情况下,如果加快查询速度,我会对延迟插入或更新感到满意。但在概述的特定案例中,我需要立即。是否有PHP命令来执行此操作?或者它与MySQL设置有关吗?

1 个答案:

答案 0 :(得分:1)

听说你搬到InnoDB http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html后可能会遇到交易问题。

与MyISAM不同,InnoDB支持隔离先前SQL命令的数据库事务,直到您使用特殊的COMMIT sql命令提交它们。通常,这不是问题,因为您将在同一数据库连接上运行相同的事务,并且默认情况下启用AUTOCOMMIT。 MySQL的自动提交功能将在数据更改后自动提交事务,例如在UPDATE之后。但是,我猜你是多次连接到数据库(或者使用正在这样做的库)并且你的库或配置正在禁用自动提交。

您可以在COMMIT之后发出SQL UPDATE并查看问题是否消失,从而轻松地对此进行测试。如果这是问题,长期解决方案取决于您使用的库,但通常您可以再次启用自动提交(通过您的库或从my.cnf或my.ini文件中删除禁用条目)或您最好开始使用交易! “MySQL数据交易教程”到处都有很多文章。

您可以在执行SQL的其余部分之前执行SQL SET AUTOCOMMIT=1;一次,通过PHP启用自动提交。

这一切都假设您没有复制问题。