我如何确保我'm不从多个进程更新相同的记录?我需要表锁吗?


How do I make sure I'm not updating the same record from multiple processes? Do I need table locks?

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

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

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

只是为了彻底了解我的信息,我还运行了一些CRON作业,它们也可以修改相同的数据。

谢谢!

除了显式使用事务之外,我可以想到两个解决方案:

  • 使用SELECT…更新:http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
  • 手动更改值,使行不被其他查询选择:

    SET @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'的值,所以行不能被其他查询选择。