我刚刚从MyISAM表切换到了InnoDB,因为行锁定似乎比表锁定更好。
问题是现在我以前做过的很多事情都不起作用。
例如,我有一个脚本,它根据用户的浏览历史向他们推荐项目。这是通过在建议表中插入或更新行来完成的。推荐的实际计算是通过SQL语句完成的。因此,有时我正在执行推荐语句,然后立即(在相同的PHP脚本中)请求该语句的结果,以便将其显示给那里的用户。对于MyISAM,这是非常有效的,但是对于InnoDB,它有时会返回旧的结果,或者没有结果(如果以前没有)。
另外,我有一个表,它充当某物的队列。要使用它,我执行并更新,然后对此更新的结果进行选择。同样,它适用于MyISAM,但不适用于InnoDB。
在某些情况下,如何确保立即插入或更新行?在其他情况下,如果延迟插入或更新会加快查询的速度,我会很高兴。但在特定的情况下,我需要它是立即。是否有PHP命令来执行此操作?还是使用MySQL设置?
发布于 2013-04-06 07:08:20
听起来,自从搬到InnoDB http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html之后,您可能遇到了事务问题。
与MyISAM不同,InnoDB支持数据库事务,这些事务隔离了以前的COMMIT命令,直到您使用特殊的COMMIT SQL命令提交了它们。通常,这不是一个问题,因为您将在同一个数据库连接上运行同一事务,默认情况下启用AUTOCOMMIT。MySQL的自动提交功能将在数据更改后(例如在UPDATE之后)自动提交事务。但是,我猜想您正在多次连接到数据库(或者可能使用这样做的库),而您的库或配置正在禁用自动提交。
您可以轻松地测试这一点,方法是在COMMIT之后发出SQL UPDATE并查看问题是否消失。如果这是问题所在,长期解决方案取决于您正在使用的库,但通常您可以再次启用自动提交(通过库或从my.cnf或my.ini文件中删除禁用的条目),或者最好开始使用事务!到处都有关于"MySQL数据事务教程“的文章。
在执行其余的SET AUTOCOMMIT=1;之前,您可以通过执行一次SQL来通过PHP启用自动提交。
这都假设您没有复制问题。
https://stackoverflow.com/questions/15847598
复制相似问题