Когда exacly MySQL блокирует строку при обновлении таблицы InnoDB?

Если у меня есть этот многозадачный запрос

UPDATE user u
INNER JOIN user_profile up ON up.user_id = u.id
SET u.name = 'same_name_i_already_had', up.profile.age = 25
WHERE u.id = 10

Предположим, что строка 10 в пользовательской таблице уже имеет имя "same_name_i_already_had", поэтому ее не следует обновлять. С другой стороны, строка в таблице user_profile имеет разный возраст, поэтому MySQL должен ее обновить.

Предполагая MySQL как RDBMS и InnoDB со своей системой блокировки уровня строки как движок обеих таблиц,

Заблокирует ли MySQL строку в пользовательской таблице несмотря на то, что не нужно обновлять поле имени этой строки?

Спасибо!!

Ответы

Ответ 1

Он блокирует строку в user. Вы можете проверить это, используя отличный инструмент innotop.

  • Запустите innotop и нажмите клавишу "L", чтобы отобразить экран блокировок InnoDB.
  • Откройте еще один сеанс, войдите в MySQL и START TRANSACTION.
  • Выполните UPDATE, который вы показали, но еще не COMMIT.
  • Просмотр блокировок на экране innotop.

Например, я создал таблицы user и user_profile на моей тестовой виртуальной машине под управлением MySQL 5.5, и я выполнил приведенные выше шаги. Здесь вывод:

[RO] Locks (? for help) localhost, 08:34.568, InnoDB 10s :-), 0.10 QPS, 2/0/0 con/run/cac thds, 5.5.

__________________________________________ InnoDB Locks __________________________________________
ID  Type    Waiting  Wait   Active  Mode  DB    Table         Index    Ins Intent  Special        
 2  TABLE         0  00:00   02:35  IX    test  user                            0                 
 2  RECORD        0  00:00   02:35  X     test  user          PRIMARY           0  rec but not gap
 2  TABLE         0  00:00   02:35  IX    test  user_profile                    0                 
 2  RECORD        0  00:00   02:35  X     test  user_profile  PRIMARY           0  rec but not gap

Ответ 2

Почти наверняка он блокирует строку независимо. Я не знаю никаких простых полей, которые сначала проверяются на изменение. Легче и быстрее просто блокировать, писать и разблокировать. Если перед блокировкой была проверка, тогда есть условие гонки: что-то, что блокировка полностью избегает.