首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP & MySQL InnoDB:插入或更新后立即不可用的数据

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

Stack Overflow用户
提问于 2013-04-06 05:58:16
回答 1查看 2.6K关注 0票数 1

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

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

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

另外,我有一个表,它充当某物的队列。要使用它,我执行并更新,然后对此更新的结果进行选择。同样,它适用于MyISAM,但不适用于InnoDB。

在某些情况下,如何确保立即插入或更新行?在其他情况下,如果延迟插入或更新会加快查询的速度,我会很高兴。但在特定的情况下,我需要它是立即。是否有PHP命令来执行此操作?还是使用MySQL设置?

EN

回答 1

Stack Overflow用户

发布于 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启用自动提交。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15847598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档