Я запускаю эти запросы в MySQL 5.6.13. Я использую повторяемый уровень изоляции чтения. Таблица выглядит следующим образом:
В терминале сеанса A я выдал приведенное ниже заявление
UPDATE manufacurer
SET lead_time = 2
WHERE mname = 'Hayleys';
В терминале сеанса B я попытался обновить значение lead_time кабелей ACL до 2. Но поскольку предыдущая команда UPDATE из сеанса A еще не зафиксирована (а сеанс A имеет эксклюзивную блокировку таблицы производителей), это обновление ожидает. Это я могу понять.
Но когда я пытаюсь выполнить оператор SELECT в сеансе B, как показано ниже,
SELECT * FROM manufacturer
WHERE mcode = 'ACL';
он правильно запрашивает таблицу производителей и выдает строку. Как это может произойти? Поскольку сеанс A по-прежнему удерживает монопольную блокировку таблицы производителя, и, как я понимаю, когда монопольная блокировка удерживается на таблице, никакие другие транзакции не могут читать или записывать ее до тех пор, пока предыдущая транзакция не будет зафиксирована.
UPDATE
касается только строкиWHERE mname = 'Hayleys'
. Ваш SELECT предназначен для данных в другой строкеWHERE mcode = 'ACL'
. Таким образом, эта строка безопасна для чтения, хотя это также зависит от того, какие индексы у вас есть в вашей таблице — может быть заблокировано больше строк, чем обновленные строки. - person nos   schedule 12.11.2013