Любой способ выбрать, не вызывая блокировки в MySQL?

$x_amount_of_lines = 30;
$log = 'path/to/log.txt';
if (filesize($log) >= $max_size)) {
  $file = file($log);
  $line = $file[0];
  $file = array_splice($file, 2, $x_amount_of_lines);
  $file = array_splice($file, 0, 0, array($line, "\n")); // put the first line back in
  ...
}

изменить: с исправлением от rcar и сохранением первой строки.

119
задан T.S. 4 September 2018 в 15:55
поделиться

7 ответов

Если это таблица 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. Таким образом, для строк, считываемых из выбранной таблицы, не устанавливаются никакие блокировки ».

23
ответ дан 24 November 2019 в 01:50
поделиться

Используйте

SET TRANSACTION ISOLATION LEVEL READ UNCOMITTED.

Документы версии 5.0 здесь .

Документы версии 5.1 находятся здесь .

16
ответ дан 24 November 2019 в 01:50
поделиться

Нашла статью под названием «MYSQL WITH NOLOCK»

https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql- with-nolock.aspx

в MS SQL Server вы должны сделать следующее:

SELECT * FROM TABLE_NAME WITH (nolock)

и эквивалент MYSQL

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

EDIT

Майкл Майор предложил следующее (из комментариев)

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
157
ответ дан 24 November 2019 в 01:50
поделиться

Вы можете прочитать эту страницу руководства MySQL. Блокировка таблицы зависит от ее типа.

MyISAM использует блокировки таблиц для достижения очень высокой скорости чтения, но если у вас есть ожидающий запрос UPDATE, то будущие SELECTS будут стоять в очереди после UPDATE.

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

13
ответ дан 24 November 2019 в 01:50
поделиться

В зависимости от типа вашей таблицы блокировка будет выполняться по-разному, но также и счетчик SELECT. Для таблиц MyISAM простая таблица SELECT count (*) FROM не должна блокировать таблицу, поскольку она обращается к метаданным для получения счетчика записей. Innodb займет больше времени, так как он должен захватить таблицу в моментальном снимке для подсчета записей, но это не должно вызывать блокировки.

Вы должны, по крайней мере, установить для concurrent_insert значение 1 (по умолчанию). Затем, если в файле данных для заполнения таблицы нет «пробелов», вставки будут добавлены к файлу, и операции SELECT и INSERT могут выполняться одновременно с таблицами MyISAM. Обратите внимание, что удаление записи создает «пробел» в файле данных, который будет пытаться заполнить будущими вставками и обновлениями.

Если вы редко удаляете записи, то вы можете установить concurrent_insert равным 2, и вставки всегда будут добавляться в конец файла данных. Тогда выбор и вставка могут происходить одновременно, но ваш файл данных никогда не станет меньше, независимо от того, сколько записей вы удаляете (кроме всех записей).

В итоге, если у вас много обновлений, вставки и выборки на table, вы должны сделать его InnoDB. Однако вы можете свободно смешивать типы таблиц в системе.

2
ответ дан 24 November 2019 в 01:50
поделиться

Из эта ссылка:

Если вы явно устанавливаете блокировку таблицы с LOCK TABLES вы можете запросить ЧИТАТЬ ЛОКАЛЬНУЮ блокировку, а не ЧИТАТЬ заблокировать, чтобы разрешить другим сеансам выполнять одновременные вставки, пока вы заблокируйте таблицу.

0
ответ дан 24 November 2019 в 01:50
поделиться

SELECT обычно не выполняет никаких блокировок, о которых вы заботитесь, в таблицах InnoDB. Уровень изоляции транзакции по умолчанию означает, что выбор не блокирует данные.

Конечно, конфликты все еще происходят.

0
ответ дан 24 November 2019 в 01:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: