2013-10-08 4 views
0

Почему все записи выполняются при блокировке записи в mysql?Почему все записи выполняются при блокировке записи в mysql?

Когда сеанс получает блокировку записи (не получил блокировку), все блокировки записи блокируются. Я думаю, что это нелогично.

Сессия не получает блокировку означает, что замок не работает.

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

Например:

Сессия A:

begin; 
select * from test; 

Сессия B:

lock table test write; # the session is blocked. 

Сессия C:

insert into test values (xxx); # the session is blocked. 

Обе сессии Ь и сессия с ар e «дождитесь блокировки метаданных».

Я думаю, что сессия с может вставить успешно, как сессии б НЕ получить блокировку ПОКА. Но все записи записываются в очередь с именем «wait for metadata lock» и блокируются.

Я хочу блокировку, которая не блокирует другие запросы, когда они еще не получены.

Моего случай онлайно DDL:

Сценарии:

lock table test write; # will block all queries if long transations exists; 
remember some markers; 
unlock tables; 
create tmp_table;  
add some triggers; # will block all the queries if long transations exists; 
copy data; 
rename table names; will block all the queries if long transations exists; 

Это слишком опасно, если есть длинная транзакция.

+0

Я ни за что не знаю, о чем вы говорите. Можете ли вы показать нам последовательность операторов SQL, которые вы используете? например подробности о том, как вы «приобрели блокировку записи»? –

+0

Я внесла некоторые изменения. – lifei

+1

Сессия B ** приобретает ** блокировку, когда выполняет «таблицу блокировки». Не позже. Весь процесс кажется мне немного странным. Почему у вас есть сеанс блокировки таблицы, если вы * знаете * есть другие сеансы, пытающиеся вставить в эту таблицу? Похоже, что использование правильных транзакций позволит решить вашу проблему без блокировок таблиц (которые являются верным способом сделать ваше приложение не масштабируемым) –

ответ

2

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

+0

сеанс A имеет незавершенную транскрипцию, которая заблокировала оператор таблицы блокировки сессии B. – lifei

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