MySQL блокировка строк myisam innodb - PullRequest
1 голос
/ 24 февраля 2012

У меня есть теоретический вопрос, и я не могу найти хорошее решение для этого в сети:

Для tblA с 100 000 записей.

Я хочу иметь несколько процессов /запущенные приложения, каждое из которых обращается к tblA.

Я не хочу, чтобы приложения имели доступ к одним и тем же спискам.то есть, я хочу, чтобы appA получил доступ к первым 50 строкам, appB получил доступ к следующим 50, а appC получил доступ к следующим 50 после этого"N" в таблице.Я ищу способ доступа / обработки данных строки как можно быстрее, по существу, запуска приложений одновременно.но я не хочу, чтобы приложения обрабатывали одни и те же строки.

Итак, как же настроить этот тип процесса?

Это просто что-то вроде:

 select from tblA limit 50 
 and doing some kind of row locking for each row (which requires innodb)

Код указателей / псевдо был бы полезен.

Ответы [ 4 ]

1 голос
/ 25 февраля 2012

Вот несколько сообщений от DBA StackExchange по этому

В нем обсуждается SELECT ... LOCK IN SHARE MODE и возможные головные боли, которые идут с ним.

Перкона написала хорошую статью на эту тему вместе с SELECT ... FOR UPDATE

0 голосов
/ 03 ноября 2014

Проблема с этими решениями заключается во времени задержки.Если процесс A выполняется в 12:00:00, а процесс B также выполняется в одно и то же время, а в приложении имеется несколько блоков различного кода, ведущих к блокировкам / DML, время обработки для каждого из них будет различным.Таким образом, процесс A может завершиться первым, или это может быть процесс B. Если процесс A устанавливает блокировку, а процесс B изменяет запись первым, у вас проблемы.Это проблема с разветвлением.

0 голосов
/ 25 февраля 2012

Если вы специально ищете для обработки первый набор, второй набор и т. Д. Вы можете использовать LIMIT # (то есть 0,50 51 100 101 150) с ORDER BY. Блокировка не требуется, поскольку процессы даже не будут пытаться получить доступ к наборам записей друг друга. Но я не могу представить сценарий, в котором это было бы хорошей реализацией.

Альтернативой является просто использовать обновление с ограничением, а затем выбирать записи, которые были обновлены. Вы можете использовать идентификатор процесса, случайное число или что-то еще, что почти гарантированно будет уникальным для всех процессов. Добавьте в таблицу поле «статус», указывающее, доступна ли запись для обработки (то есть значение равно NULL). Затем каждый процесс обновляет поле состояния, чтобы «владеть» записью для обработки.

UPDATE tblA SET status=1234567890 WHERE status IS NULL LIMIT 50;
SELECT * FROM tblA WHERE status=1234567890;

Это будет работать для MyISAM или Innodb. С Innodb вы сможете запускать несколько обновлений одновременно, улучшая производительность.

0 голосов
/ 25 февраля 2012

Ваше приложение должно обрабатывать данные, к которым оно хочет получить доступ. Создайте указатель в этом. Если вы используете хранимые процедуры, используйте другую таблицу для хранения указателей. Каждый процесс должен «зарезервировать» набор строк перед началом обработки. Каждый процесс должен проверить максимальную величину этого, а также посмотреть, не превышает ли она длину таблицы.

...