Блокировка строки для обновления - PullRequest
2 голосов
/ 11 февраля 2011

У меня есть таблица innodb, прочитанная множеством разных экземпляров (облако)

Демон в каждом экземпляре занимает 100 строк, чтобы «сделать что-то» из этой таблицы, но я не хочу 2 (или более) экземпляровчтобы взять те же вещи.

Итак, у меня есть столбец «status» («todo», «do», «done»).

INSTANCE 1: требуется 100 строк, где status ="todo" ... Затем мне нужно ОБНОВИТЬ эти строки как можно скорее, чтобы получить статус "выполняется", поэтому INSTANCE 2,3, .. x не может взять те же строки.

Как я могу это сделать?

Пожалуйста, я бы хотел решение без БЛОКИРОВКИ ВСЕЙ таблицы, но с блокировкой только строк (это потому, что я использую innodb) ... Я много читал об этом (LOCK SHARE MODE, FOR UPDATE, COMMITs ...) но я не понимаю правильный путь ...

Ответы [ 2 ]

0 голосов
/ 14 февраля 2011

используйте транзакцию, а затем SELECT ... FOR UPDATE, когда вы читаете записи. Таким образом, прочитанные вами записи заблокированы. Когда вы получите все данные, обновите записи, чтобы "делать" и COMMIT транзакции Возможно, вам не хватало использования транзакции или правильного порядка команд. Вот базовый пример:

BEGIN TRANSACTION;
SELECT * FROM table WHERE STATUS = 'todo' FOR UPDATE;

// Loop over results in code, save necessary data to array/list..

UPDATE table SET STATUS ='doing' WHERE ...;
COMMIT;

// process the data...

UPDATE table SET STATUS ='done' WHERE ...;
0 голосов
/ 11 февраля 2011

Для этого необходимо использовать функции LOCK TABLES и UNLOCK TABLES:

http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

...