我需要在两个 MySQL/InnoDB 表上锁定并执行两个 select 语句。两个表都有相关的行名称 updateId
。
SELECT ..., updateId FROM Table1 WHERE ...
SELECT ..., updateId FROM Table2 WHERE ...
我需要防止更新、插入或删除(对表的任何修改),直到两个 SELECT 语句都执行为止。
基本上我想防止在两个语句之间对 updateId
行进行任何更改。
我正在查看 SELECT ... FOR SHARE
和 SELECT ... FOR UPDATE
但我只是有点不清楚它是如何工作的。
最佳答案
其他进程可以!!写入,但第一个进程处理交易中当时的数据。
这是一个交易示例
MariaDB [trans]> select * from table1;
+----+-------------+
| id | field1 |
+----+-------------+
| 1 | table 1 -1 |
| 2 | table 1 - 2 |
+----+-------------+
2 rows in set (0.001 sec)
MariaDB [trans]> start transaction;
Query OK, 0 rows affected (0.000 sec)
MariaDB [trans]> select * from table1;
+----+-------------+
| id | field1 |
+----+-------------+
| 1 | table 1 -1 |
| 2 | table 1 - 2 |
+----+-------------+
2 rows in set (0.000 sec)
CLIENT 2:
MariaDB [trans]> update table1 set field1 = 'new value' where id = 1;
Query OK, 1 row affected (0.003 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [trans]>
MariaDB [trans]> select * from table1;
+----+-------------+
| id | field1 |
+----+-------------+
| 1 | table 1 -1 |
| 2 | table 1 - 2 |
+----+-------------+
2 rows in set (0.001 sec)
MariaDB [trans]> commit;
Query OK, 0 rows affected (0.001 sec)
MariaDB [trans]> select * from table1;
+----+-------------+
| id | field1 |
+----+-------------+
| 1 | new value |
| 2 | table 1 - 2 |
+----+-------------+
2 rows in set (0.001 sec)
MariaDB [trans]>
关于mysql - 如何锁定 MySQL 表以防止更新,直到执行两个单独的 select 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55415387/