Запрос:
SELECT COUNT(online.account_id) cnt from online;
Но онлайн-таблица также изменяется событием, поэтому часто я вижу блокировку при запуске show processlist
.
Есть ли в MySQL какая-либо грамматика, которая может заставить оператор select не вызывать блокировки?
И я забыл упомянуть выше, что он находится в подчиненной базе данных MySQL.
После того, как я добавлю в my.cnf:transaction-isolation = READ-UNCOMMITTED
раб, выйдет ошибка:
Ошибка 'Двоичное ведение журнала невозможно. Сообщение: уровень транзакции 'READ-UNCOMMITTED' в InnoDB небезопасен для режима binlog 'STATEMENT' по запросу
Итак, есть ли совместимый способ сделать это?
Ответы:
Нашел статью под названием "MYSQL WITH NOLOCK"
https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql-with-nolock.aspx
в MS SQL Server вы должны сделать следующее:
и эквивалент MYSQL
РЕДАКТИРОВАТЬ
Майкл Миор предложил следующее (из комментариев)
источник
SESSION
и, таким образом, применить уровень транзакции только к следующей транзакции. Затем просто замените третий оператор выше наCOMMIT
. В этом случае это будет пустым звуком, но побочным эффектом будет завершение транзакции и возврат к уровню изоляции по умолчанию.SET TRANSACTION
состояния оператора : «Этот оператор устанавливает уровень изоляции транзакции, используемый для операций с таблицами InnoDB».Если таблица InnoDB, см. Http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html - он использует согласованное чтение (режим без блокировки) для SELECT, "которые делают не указывайте FOR UPDATE или LOCK IN SHARE MODE, если установлена опция innodb_locks_unsafe_for_binlog и уровень изоляции транзакции не установлен на SERIALIZABLE. Таким образом, для строк, считываемых из выбранной таблицы, не устанавливаются блокировки ».
источник
использование
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
Версия 5.0 Документы здесь .
Документы версии 5.1 здесь .
источник
Вы можете прочитать эту страницу руководства MySQL. Как таблица блокируется, зависит от ее типа.
MyISAM использует блокировки таблиц для достижения очень высокой скорости чтения, но если у вас есть ожидающий оператор UPDATE, то будущие SELECTS будут стоять в очереди после UPDATE.
Таблицы InnoDB используют блокировку на уровне строк, и у вас не будет блокировки всей таблицы за UPDATE. Есть и другие проблемы с блокировкой, связанные с InnoDB, но вы можете обнаружить, что это соответствует вашим потребностям.
источник
В зависимости от типа вашей таблицы блокировка будет выполняться по-разному, но также будет счетчик SELECT. Для таблиц MyISAM простая таблица SELECT count (*) FROM не должна блокировать таблицу, поскольку она обращается к метаданным для получения счетчика записей. Innodb займет больше времени, так как ему нужно захватить таблицу в снимке для подсчета записей, но это не должно вызывать блокировки.
По крайней мере, для concurrent_insert должно быть установлено значение 1 (по умолчанию). Затем, если в файле данных для заполнения таблицы нет «пробелов», вставки будут добавлены к файлу, и операции SELECT и INSERT могут выполняться одновременно с таблицами MyISAM. Обратите внимание, что при удалении записи в файле данных возникает «пробел», который будет пытаться заполнить будущими вставками и обновлениями.
Если вы редко удаляете записи, тогда вы можете установить concurrent_insert равным 2, и вставки всегда будут добавляться в конец файла данных. Тогда выбор и вставка могут происходить одновременно, но ваш файл данных никогда не станет меньше, независимо от того, сколько записей вы удалите (кроме всех записей).
Суть в том, что если у вас много обновлений, вставок и выборок в таблице, вы должны сделать это InnoDB. Однако вы можете свободно смешивать типы таблиц в системе.
источник
Другой способ включить грязное чтение в mysql - добавить подсказку: LOCK IN SHARE MODE
источник
Из этой ссылки:
источник
SELECT обычно не выполняет никаких блокировок, о которых вы заботитесь, в таблицах InnoDB. Уровень изоляции транзакции по умолчанию означает, что выбор не блокирует данные.
Конечно, раздоры все еще случаются.
источник
show processlist
чтобы фактически увидеть блокировки. Таким образом, можно с уверенностью предположить, что на самом деле блокировка взята.