如何锁定MySQL表,使其无法进行更新,直到执行两个单独的select语句

时间:2019-03-29 10:28:53

标签: mysql sql database locking innodb

我需要在两个MySQL / InnoDB表上锁定并执行两个select语句。这两个表都有相关的行名updateId

SELECT ..., updateId FROM Table1 WHERE ...
SELECT ..., updateId FROM Table2 WHERE ...

在两个SELECT语句都执行之前,我需要防止更新,插入或删除(对表的任何修改)。 基本上,我想防止对两个语句之间的updateId行进行任何更改。

我正在查看SELECT ... FOR SHARESELECT ... FOR UPDATE,但我不清楚它是如何工作的。

2 个答案:

答案 0 :(得分:2)

其他过程可以!!进行写操作,但是第一个过程可以在事务处理后立即处理数据。

这是交易示例

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]> 

答案 1 :(得分:0)

START TRANSACTION;
SELECT ... FOR UPDATE;
SELECT ... FOR UPDATE;
blah, blah, blah
UPDATE/INSERT/etc (if desired)
COMMIT;

FOR UPDATE的意思是“我可能更改此SELECT中的行,所以请不要动手!”