2012-02-24 6 views
1

У меня теоретический вопрос и не может найти хорошее решение для этого в сети:MySQL строки блокировки MyISAM InnoDB

Для более TBLA с 100000 РИК.

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

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

Так что в основном я хочу, чтобы приложения выполняли некоторую выборку на следующем «N »в таблице. Я ищу способ доступа/обработки данных строки как можно быстрее, по сути, запуск приложений одновременно. но я не хочу, чтобы приложения обрабатывали одни и те же строки.

Итак, как именно этот процесс должен быть настроен?

Это просто делает вид:

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

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

+1

1.) myisam делает блокировку таблицы, нет блокировки строк или страниц. Необходимо использовать innoDB. http://stackoverflow.com/questions/917640/any-way-to-select-without-causing-locking-in-mysql 2.) получить размер полного запроса, а затем обрабатывать разделы для каждого запроса в вашем приложении; mysql позаботится о блокировке – Alfabravo

+0

Как сказал @Alfabravo, в настоящее время движок innodb способен выполнять блокировку на уровне строк. Возможно, вам стоит рассмотреть такую ​​обработку хранимых процедур. Однако у нас нет подробной информации о том, какая обработка вы хотите сделать, что наиболее важно для принятия решения для решения – rkosegi

ответ

0

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

0

Если вы специально ищете обработку первого набора, второго набора и т. Д., Вы можете использовать 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

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

Смежные вопросы