2010-11-09 8 views
4

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

Так что я могу иметь этот график

делает блокировку чтения на минуту B, C, D, E ... и многое другое по-прежнему читать из этой таблицы без проблем

Но сказать что T просит написать замок. T должен подождать .. Кажется, что U V W все ждут T, хотя U V W только просят считывать блокировки, а T на самом деле не приобрел его замок.

Можно ли отключить этот приоритет First In First Out и присвоить приоритетам чтения более высокий приоритет, чем блокировки записи?

Редактировать: Возможно, есть какой-то переключатель с низким приоритетом, который я могу использовать для своих команд обновления? Я бы хотел, чтобы он был синхронным (так что поток может подождать, пока это будет сделано, хотя это низкий приоритет).

+0

Я не знаю, если это возможно, но в шумном базе данных я думаю, что это приведет к высокой вероятности голодания для записи поскольку они никогда не могут быть получены, если требуются постоянные блокировки чтения. – tloach

+3

Мы говорим о 'MyISAM', не так ли? – Quassnoi

+0

@tloach Обычно нет постоянных замков чтения. –

ответ

1

Я нашел способ сделать обновления с низким приоритетом, не отправляя их в отдельный поток.

Изменить один из

UPDATE bob ... 
INSERT INTO bob ... 
DELETE FROM bob; 
LOCK TABLE bob WRITE; 

в

UPDATE LOW_PRIORITY bob ... 
INSERT LOW_PRIORITY INTO bob ... 
DELETE LOW_PRIORITY FROM bob; 
LOCK TABLE bob LOW_PRIORITY WRITE; 
6

Но скажите, что T запрашивает блокировку записи. T должен ждать .. Кажется, что UVW все ждут Т ,, даже если UVW просят только для чтения замков и T не на самом деле Изучается это замок еще

блокировки записи присваивается более высокий приоритет, чем блокировки чтения ,

Это означает, что T придется только ждать A, чтобы закончить, и U, V и W будут поставлены в очередь B, C, D и E.

На самом деле, блокировки чтения и записи хранятся в отдельных очередях, причем последний имеет более высокий приоритет.

В вашем случае запрос будет выполняться в следующем порядке:

A 
T 
B C D U V W 

, все после того, как T выполняется одновременно.

От docs:

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

Если вы хотите сделку письменно, чтобы ждать, пока нет заявлен не читает, вы должны явно выдавать

LOCK TABLES mytable LOW_PRIORITY WRITE 

до INSERT, и не забудьте сделать

UNLOCK TABLES 

после этого.

+0

Можете ли вы сделать обновление с более низким приоритетом, которое * не * асинхронно, или будет иметь такую ​​же проблему? Что относительно низкоприоритетного, что * * асинхронно? –

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