Mysql для обновления - PullRequest
       27

Mysql для обновления

5 голосов
/ 30 декабря 2010

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, будет ли запись заблокирована навсегда?

1 Ответ

4 голосов
/ 30 декабря 2010

Да, если транзакция № 1 не фиксируется, эти записи будут заблокированы навсегда, если только соединение не прервется или innodb не решит откатить транзакцию из-за обнаружения взаимоблокировки.

но так как идентификатор 2 был изменен на идентификатор 3 транзакцией, которая была выполнена во-первых, запись не была возвращена.

Разве это не то, что вы хотите? если нет, то вы не используете SELECT ... FOR UPDATE правильно. см http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

...