我正在使用 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/