Уточнение разницы между блокировкой на уровне строк в движке InnoDB и блокировкой на уровне таблиц в движке MyISAM в базе данных MySQL
Скажем, у меня есть два пользователя, пытающихся добраться до таблицы в базе данных под названием "комментарии" в следующем порядке:
-
Пользователь1 создает и обновляет запись с id = 10
Комментарии UPDATE SET comment = "Hello World" WHERE id = 10
-
Пользователь2 делает выбор для всех строк одних и тех же комментариев таблицы
SELECT * FROM comments
Я хочу обсудить разницу между следующими случаями:
- Если движок таблицы MyISAM: запрос обновления блокирует
целую таблицу, которая будет помещать запрос выбора до тех пор, пока обновление
строка закончена, и затем она будет выполнена, что остановит любой
пользователь запрашивает что-либо из этой таблицы до тех пор, пока обновление не будет
закончил.
- Если движок таблицы InnoDB: запрос на обновление блокирует обновленную строку.
Я ХОЧУ ЗНАТЬ, КАК ЭТО БЛОКИРОВАЛО В ОТНОШЕНИИ ВЫБОРНОГО ЗАПРОСА???
Я имею в виду, что если выбор запрашивает базу данных для всех записей таблицы комментариев и обнаружит, что один из них (id = 10) заблокирован, очередь базы данных снова запрашивает запрос выбора до тех пор, пока обновление не будет завершено?
Если да, то в чем разница между двумя двигателями?
Если нет, я хочу сказать, что у меня такая же ситуация выше на моем веб-сайте, и даже я изменил свои движки таблиц от MyISAM до InnoDB, но проблема очереди в запросах, когда еще есть запрос на обновление или вставку.
Любое объяснение этой ситуации будет настолько полезно. заранее спасибо
Ответы
Ответ 1
В InnoDB это зависит от того, включена ли транзакция или нет. InnoDB имеет функцию MVCC, которая означает, что при обновлении потока 1 поток 2 может читать без блокировки.
об этом уже сказано здесь Строка InnoDB блокируется так же, как Чтение не-блокировки MVCC?
если транзакция отключена, то же самое с MyISAM? Я так думаю, но не уверен.
Ответ 2
В Innodb в вашем сценарии результат будет получен для запроса select, но со старыми данными для строки, где id = 10, если не обновлено. Результат не останавливается.