Можно ли выполнить запрос выбора в MySQL без каких-либо блокировок чтения? - PullRequest
3 голосов
/ 07 января 2010

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

Ответы [ 2 ]

4 голосов
/ 07 января 2010

С InnoDB вы достигнете этого, установив уровень изоляции транзакции: READ UNCOMMITTED.

На этом уровне изоляции:

Операторы SELECT выполняются в неблокирующая мода, но возможная более ранняя версия строки может быть используемый. Таким образом, используя эту изоляцию уровень, такие чтения не соответствуют. Это также называется «грязное чтение». В противном случае этот уровень изоляции работает как READ COMMITTED.

Вы можете либо изменить уровень изоляции транзакции по умолчанию из файла параметров MySQL, либо он может быть включен и отключен для одного сеанса:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM table_name;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Дополнительная литература: Документация MySQL: транзакция Set

1 голос
/ 07 января 2010

в отсутствие LOCK TABLES myisam должен быть эквивалентен режиму чтения без фиксации, но на самом деле он не поддерживает никакие типы транзакций ...

innodb по умолчанию работает в режиме «согласованного чтения» (с уровнем изоляции «повторяемое чтение»), который, как предполагается в документации, не блокируется:

Если уровень изоляции транзакции REPEATABLE READ (уровень по умолчанию), все последовательные чтения в одном и том же транзакция читать снимок установлено первым таким прочитанным в эта транзакция

...

Последовательное чтение является режимом по умолчанию в который InnoDB обрабатывает SELECT заявления в READ COMMITTED и ПОВТОРЯЕМЫЕ ЧИТАЙТЕ уровни изоляции. последовательное чтение не устанавливает никаких блокировок на столах это происходит, и поэтому другие сессии свободны изменить эти таблицы одновременно последовательное чтение выполняется на стол.

...

InnoDB использует согласованное чтение для выберите в пунктах, как INSERT INTO ... ВЫБРАТЬ, ОБНОВИТЬ ... (ВЫБРАТЬ) и СОЗДАЙТЕ ТАБЛИЦУ ... ВЫБЕРИТЕ, что не указать для обновления или блокировки в акции РЕЖИМ, если опция innodb_locks_unsafe_for_binlog установлен и уровень изоляции транзакция не установлена ​​в SERIALIZABLE. Таким образом, блокировки не установлены по строкам, считанным из выбранной таблицы.

http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html

...