我正在开发一个使用 MySQL 数据库作为后端(从 PHP 访问)的项目。有时,我选择一行,对其进行一些操作,然后更新数据库中的记录。
我担心另一个用户可能在第一次选择后立即在同一行上启动类似的过程,并且他的更改可能会覆盖第一个用户所做的一些更改(因为第二个用户的选择尚未包含这些更改) )。
这是一个实际问题吗?我应该锁定表吗?这不会严重影响我的应用程序的性能吗?还有其他解决方案吗?
为了全面了解我的信息,我还运行了一些 CRON 作业,这些作业也可能会修改相同的数据。
谢谢!
最佳答案
除了显式使用事务之外,我可以想到两种解决方案:
- 使用 SELECT .. 进行更新: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) WHEREstatus
= 'WAITING' AND [您的条件] LIMIT 1;选择@update_id;
此处,要选择的行必须具有 status="WAITING"值。当此查询运行时,它会选择 ID,并更改“status”的值,因此其他查询无法选择该行。
关于php - 如何确保我不会从多个进程更新同一条记录?我需要表锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23971473/