mysql - mysql 事务期间锁定表

标签 mysql sql innodb

我正在使用 PHP 运行多个 mysql 查询来更改多个表中的值。

基本上是这样的(简化的伪代码)

$amount = (SELECT amount FROM wallet WHERE id = 1);
$amount = somelongcomplicatedtask($amount);
(UPDATE wallet SET amount = $amount WHERE id = 23);

可能有许多脚本并行使用 mysql 数据库(写入/读取),我需要确保确保以下几点:

  • 如果其中一个查询失败,则迄今为止完成的所有工作都会恢复(我可以为此使用 TRANSACTIONS)
  • 当我处理表钱包中的两行(1 和 23)时,它们需要被锁定,因此任何想要读取或写入它们的进程(当前进程除外)都必须等待。 (如果不可能只锁定行,锁定整个表也可以)

该表使用InnoDB引擎。

问题是,如果我使用LOCK TABLES wallet WRITE锁定表,然后运行START TRANSACTION,这将清除锁定。如果我首先运行START TRANSACTION,然后使用LOCK TABLES锁定表,那么锁将提交已启动的事务...这两件事只会相互关闭,但我需要它们同时处于事件状态。

处理这个问题的最佳方法是什么?

最佳答案

MySQL InnoDB 存储引擎已经支持行级锁定。 在这种情况下,您必须对该特定行采取独占锁,以便其他事务将等待,直到第一个事务释放他的锁。更多信息:InnoDB Locking Explained

关于mysql - mysql 事务期间锁定表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49009710/

相关文章:

mysql - 如何扩展此表以支持修订历史记录

php - 如何显示用户上次登录 MySQL 的日期和时间?

MySQL 索引 - In 与 Equals 索引问题

mysql - 优化 MySql InnoDB 数据库中的慢速查询

php - 按表头对 MySql 行进行排序

mysql - 从 mysql 的数据库表中以层次结构方式删除项目的最佳方法?

一个表的MySQL速度受其他表的大小影响吗?

sql - “TRIM”不是可识别的内置函数名称

Mysql InnoDb 在 SELECT 查询上非常慢

MySQL BMI计算