MySQL поддерживает ключевое слово «для обновления».Вот как я проверил, что он работает, как ожидалось.Я открыл 2 вкладки браузера и выполнил следующие команды в одном окне.
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from myxml where id = 2 for update;
....
mysql> update myxml set id = 3 where id = 2 limit 1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.08 sec)
В другом окне я запустил транзакцию и попытался установить блокировку обновления для той же записи.
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from myxml where id = 2 for update;
Empty set (43.81 sec)
Как видно из приведенного выше примера, я не мог выбрать запись в течение 43 секунд, поскольку транзакция обрабатывалась другим приложением в окне № 1. Как только транзакция была завершена, я получил возможность выбрать запись, но поскольку транзакция, выполненная первой, изменила идентификатор 2 на идентификатор 3. Запись не была возвращена.
Мой вопрос: каковы недостатки использования синтаксиса «для обновления»?Если я не зафиксирую транзакцию, запущенную в окне 1, будет ли запись заблокирована навсегда?