【发布时间】:2018-02-27 13:21:51
【问题描述】:
我正在使用 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 锁定表,那么锁定将提交启动的事务......这两件事只是互相关闭,但我需要它们同时激活.
处理这个问题的最佳方法是什么?
【问题讨论】: