Обновление столбца с индексом вызывает тупик - PullRequest
1 голос
/ 08 мая 2020
Update XyzTable set state ='second' where pgmNumber = 'prog123' and state = 'first'

Столбец состояния - столбец с низкой мощностью, имеющий только 4 значения. Оба столбца state и pgmNumber имеют индивидуальный индекс.

Для каждого pgmNumber есть одна строка.

Тупиковые ситуации возникают, даже если вышеуказанный запрос выполняется одновременно с разными pgmNumber.

Как лучше всего решить проблему?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Тупик возникает из-за того, что страница индекса для столбца «состояние» заблокирована запросом.

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

Кроме того, при сообщении о взаимоблокировках InnoDB, пожалуйста, опубликуйте вывод «SHOW ENGINE INNODB STATUS».

0 голосов
/ 09 мая 2020

Этот UPDATE выиграет от составного индекса:

INDEX(pgmNumber, state)

Тупиковой ситуации, вероятно, не должно быть. Итак, ответьте на несколько вопросов:

Пожалуйста, предоставьте SHOW CREATE TABLE.

С каким запросом происходит взаимоблокировка?

Является ли UPDATE частью транзакции с несколькими операторами (BEGIN...COMMIT)? Если да, то давайте посмотрим на другие запросы.

У вас есть SELECT в той же строке? Если да, то есть ли на конце FOR UPDATE?

Редко бывает полезно иметь индекс для столбца с низкой мощностью. Бросьте свой INDEX(state).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...