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

Хотите знать, как работают блокировки для запроса на обновление составного ключа в MySql?

Пример: если таблица A имеет составной ключ a1 и a2

a1    |   a2    |  a3
1     |   a     |  10
1     |   b     |  11
1     |   c     |  12
2     |   a     |  20
2     |   b     |  21

Если мы выполним запрос UPDATE TABLE A SET a3 = 30 WHERE a1 = 1 AND a2 = a Тогда 1 или 4 строки получат LOCK?

Всего 1 ответ


Быстрый эксперимент показывает, что в этом случае блокируется только одна строка. Я проверил это с помощью составного первичного ключа:

CREATE TABLE `lock_tst` (
    `k1` INT(11) NOT NULL,
    `k2` INT(11) NOT NULL,
    `f1` INT(11) NOT NULL,
    PRIMARY KEY (`k1`, `k2`)
)
ENGINE=InnoDB

И блокирующие операторы, подобные этим:

select * from test.lock_tst where k1=1 and k2=42 for update;

Следует также отметить, что нет никакой гарантии, что MySQL всегда будет блокировать минимально возможные строки.


Есть идеи?

10000