2013-11-25 6 views
0

У меня есть таблица с двигателем InnoDB (комментарии) в базе данных MySQL и у меня есть следующий сценарий:Понимания InnoDB и его уровня изоляции и блокировки

Есть два пользователя пытается получить доступ к одной комментариям таблицы в том же время следующим образом:

user1:

INSERT INTO comments (comment) VALUES ('HELLO WORLD'); 

user2:

SELECT * FROM comments; 

Я хочу, чтобы следующие моменты уточнить, пожалуйста:

  1. user2 не может прочитать (SELECT) из таблицы, он должен подождать некоторое время (я думаю, что пока вставка user1 не finihshed). Ожидается ли это ожидание на уровне строки, которое используется InnoDB?
  2. Если ответ на предыдущий вопрос был ДА, то Что такое работа MVCC? Двигатель InnoDB. Я прочитал, что MVCC означает, что пользователи могут читать строки таблицы (readable-read), даже если есть ситуация с обновлением или вставкой в ​​одно и то же время (потому что пользователь здесь читает старую версию строки, даже если она обновляется на тем временем).

Примечания:

  • Я хочу отметить, что я использую приведенный выше код в следующей форме, но она по-прежнему делает ту же проблему (ожидание проблемы):

user1:

SET AUTOCOMMIT=0; 
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
INSERT INTO comments (comment) VALUES ('HELLO WORLD'); 
COMMIT; 

user2:

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

user1:

SET AUTOCOMMIT=0; 
START TRANSACTION; 
INSERT INTO comments (comment) VALUES ('HELLO WORLD'); 
COMMIT; 

user2:

SELECT * FROM comments; 

Большой вопрос Как могли мои пользователи прочитать в то время как другие пользователи вставки или обновления строк?

+0

нет. нет причин, по которым innodb блокирует таблицу для чтения, если вы вставляете другую строку. Просто откройте 2 подключения на двух разных терминалах и запустите свой сценарий – zerkms

+0

Я попробовал, и это не сработало для этого, я задаю вопрос – Basel

+0

Что означает «не работает»? – zerkms

ответ

0

Вы выбираете все из таблицы, поэтому блокировка уровня строки не поможет вам, поскольку вы запрашиваете все строки. Добавьте «где id = 5» или что-то подобное, и все в порядке.

Здесь вы можете найти некоторые объяснения различных механизмов запирающих: http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html