Правильно блокировать мою базу данных во время запуска скрипта - PullRequest
0 голосов
/ 03 марта 2012

У меня нет никаких знаний о блокировке вообще. Я просматривал некоторую документацию по MySQL и не могу полностью понять, как происходит весь этот процесс. Мне нужно, чтобы в моем сценарии произошли следующие события:

шаг 1) пользователь таблицы заблокирован
шаг 2) мой скрипт выбирает две строки из таблицы user
шаг 3) мой скрипт обновляет таблицу user
шаг 4) пользователь таблицы разблокируется, потому что скрипт выполнен

Как мне это сделать? И что происходит, когда другой пользователь запускает этот же сценарий, пока таблица заблокирована? Есть ли способ для сценария узнать, когда продолжить (когда таблица становится разблокированной?). Я посмотрел в стартовой транзакции и выбрать для обновления, но документация очень неясна. Любая помощь приветствуется. И да, таблица innodb.

Ответы [ 2 ]

0 голосов
/ 03 марта 2012

Я считаю, что вам нужен синтаксис SELECT ... FOR UPDATE, доступный для таблиц InnoDB.Это заблокирует только те записи, которые вы хотите обновить.Вам нужно обернуть это в транзакции.http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

Например, запустите ваши запросы так:

START TRANSACTION
SELECT ... FOR UPDATE
UPDATE ...
COMMIT
0 голосов
/ 03 марта 2012

Отмените шаг 2, выполнив запрос на выборку в рамках вызова обновления. Тогда MySQL позаботится обо всем остальном. Одновременно может быть запущен только один запрос на запись, остальные будут поставлены в очередь.

...