Уточнение разницы между блокировкой на уровне строк в движке 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, если не обновлено. Результат не останавливается.