0

我正在开发一个使用 MySQL 数据库作为后端的项目(从 PHP 访问)。有时,我选择一行,对其进行一些操作,然后更新数据库中的记录。

我担心另一个用户可能会在第一次选择后立即在同一行上启动类似的过程,并且他的更改可能会覆盖第一个用户所做的一些更改(因为第二个用户的选择尚未包含这些更改)。

这是一个实际的问题吗?我应该锁定表吗?这不会严重影响我的应用程序的性能吗?还有其他解决方案吗?

为了全面了解我的信息,我还运行了一些 CRON 作业,它们也可能正在修改相同的数据。

谢谢!

4

1 回答 1

1

除了明确使用事务之外,我可以想到两种解决方案:

  • 使用 SELECT .. FOR 更新:http ://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
  • 手动更改一个值,以便其他查询不会选择该行:

    设置 @update_id := 0;

    UPDATE table_name SET status= 'IN_PROCESS', id = (SELECT @update_id := id) WHERE status= 'WAITING' AND [your condition] LIMIT 1;

    选择@update_id;

此处,要选择的行的值必须为 status="WAITING"。并且当这个查询运行时,它会选择 ID,并改变 'status' 的值,所以该行不能被其他查询选择。

于 2014-05-31T17:55:56.727 回答