php - 如何确保我不会从多个进程更新同一条记录?我需要表锁吗?

标签 php mysql sql table-locking table-lock

我正在开发一个使用 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) WHERE status = 'WAITING' AND [您的条件] LIMIT 1;

    选择@update_id;

此处,要选择的行必须具有 status="WAITING"值。当此查询运行时,它会选择 ID,并更改“status”的值,因此其他查询无法选择该行。

关于php - 如何确保我不会从多个进程更新同一条记录?我需要表锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23971473/

相关文章:

sql - 按日期降序排列父行,子行在每个行下独立排序

SQL统一分配点数

sql - 在 ORACLE 中查找上季度的第一天和最后一天

php - Laravel 部署

javascript - div 类(index.php)看不到 css 文件夹

php - mysql PHP 查询中的列名无效

mysql - 清理 MySQL 查询、Wordpress wp_postmeta

mysql - 如果记录存在则添加 WHERE 子句

php - 记录 PHP 和 MySQL 上的应用程序事件

php - 在输出之前转换 mysql 输入。 Unix 时间戳到 PHP DateTime