Как заблокировать таблицы MySQL от обновления, пока не будут выполнены два отдельных оператора выбора - PullRequest
1 голос
/ 29 марта 2019

Мне нужно заблокировать и выполнить два оператора выбора для двух таблиц MySQL / InnoDB. Обе таблицы имеют связанное имя строки updateId.

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

Мне нужно предотвращать обновления, вставки или удаления (любые изменения в таблицах), пока не выполнятся оба оператора SELECT. По сути, я хочу предотвратить любые изменения в строке updateId между двумя операторами.

Я смотрел на SELECT ... FOR SHARE и SELECT ... FOR UPDATE, но мне просто немного непонятно, как это работает.

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

Может другой процесс !! пишите, но первый процесс работает с данными в данный момент от транзакции.

вот пример с транзакцией

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]> 
0 голосов
/ 09 мая 2019
START TRANSACTION;
SELECT ... FOR UPDATE;
SELECT ... FOR UPDATE;
blah, blah, blah
UPDATE/INSERT/etc (if desired)
COMMIT;

FOR UPDATE означает «I может изменить строки в этом SELECT, поэтому держите руки подальше!»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...