MySQL кластер блокирует все строки - PullRequest
0 голосов
/ 10 октября 2018

Я делаю этот тест, чтобы понять, как работает кластер Mysql NDB.Итак, у меня есть два узла sql.Подготовка Я создал следующую таблицу:

CREATE TABLE tb_id (
     id  bigint(20) NOT NULL AUTO_INCREMENT,
     ix bigint(20) default 0,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
)  ENGINE=ndbcluster DEFAULT CHARSET=latin1;

INSERT INTO tb_id (name, ix) VALUES
    ('dog', 1),('cat', 2),('penguin', 3), ('cow', 4),('tiger', 5),('fish', 6);

Я создаю 2 сеанса, каждый на своем узле, и я запускаю на обоих: set session autocommit=off; после этого на первом сеансе, который я запускаю:

UPDATE tb_id SET ix = 2 where name="cat";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

без фиксации и запуска следующего сеанса 2:

UPDATE tb_id SET ix = 2 where name="fish";
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

Почему происходит сбой второго сеанса, поскольку я не обновляю ту же строку?

1 Ответ

0 голосов
/ 16 октября 2018

Вторая транзакция использует полное сканирование таблицы, чтобы найти строки для обновления, так как в столбце имени нет индекса.Поскольку это обновление, сканирование принимает эксклюзивную блокировку для всех строк, прежде чем принять решение о необходимости обновления строки.Строка с «cat» заблокирована исключительно, поэтому, когда полное сканирование таблицы достигнет этой строки, она будет ожидать разблокировки строки.

Если у вас есть индекс для столбца имени, проблема исчезнет.Но для обновления или удаления, в котором используется условие, не поддерживающее индекс, потребуется установить эксклюзивную блокировку для каждой строки в таблице.

...