Я сделал сеанс B ожиданием удержания блокировки строки сеансом A, однако я увидел ожидание 'wait / io / table / sql / handler' вместо ожидаемой блокировки строки, такой как 'wait / lock ..... ', ниже приведены шаги по дублированию проблемы.
MySQL версия «5.7.18-debug»;
шаг 1), включите схему производительности
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
шаг 2, создайте таблицу и вставьте строку.
CREATE TABLE t (i INT) ENGINE = InnoDB;
INSERT INTO t (i) VALUES(1);
шаг 3, начните новый сеанс A Удерживайте блокировку строки и не снимайте ее.
SELECT connection_id() ;
START TRANSACTION;
DELETE FROM t WHERE i = 1;
шаг 4, начните новый сеанс B и попытайтесь получить блокировку строки, однако заблокирован сеансом A
SELECT connection_id() ;
START TRANSACTION;
SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;
шаг 5, а затем запросите схему производительности ниже, однако из таблиц PS, которые я видел 'wait / io / table / sql / handler' для сеанса B из таблицы events_waits_current, что означает ожидание операции ввода-вывода, разве не следует ожидать блокировки строки?
SELECT * FROM performance_schema.events_waits_current;
SELECT * FROM performance_schema.events_stages_current;
SELECT * FROM performance_schema.events_statements_current;