Реализация контроля параллелизма по умолчанию в MySQL - PullRequest
0 голосов
/ 11 июля 2020

Какова реализация управления параллелизмом по умолчанию в MySQL? Это блокировка optimisti c (мультиверсионное управление параллелизмом) или блокировка pessimisti c (двухфазная блокировка)? В частности, как InnoDb это делает? На внутреннем уровне, как mysql (с innodb) решает в начале транзакции, блокировать ли строку или выполнять откат после конфликта?

1 Ответ

1 голос
/ 12 июля 2020

InnoDB использует optimisti c блокировку.

Нет блокировки в начале транзакции. Как он узнает, какие строки нужно заблокировать, пока вы не выполните специальный запрос c? Он даже не знает, в какой таблице (таблицах) вам в конечном итоге понадобится заблокировать строки.

Нет необходимости в откате после конфликта блокировок. Если вы выполняете запрос в одной транзакции, которая должна ждать, потому что другой сеанс удерживает блокировку, тогда ваш запрос ожидает до определенного количества секунд (в соответствии с параметром конфигурации innodb_lock_wait_timeout, по умолчанию 50 секунд).

  • Если другой сеанс фиксируется до истечения времени ожидания, тогда ваш сеанс прекращает ожидание, получает необходимые блокировки и переходит к запросу.
  • Если время ожидания истекает до фиксации другого сеанса, ваш запрос возвращается ошибка. Это по-прежнему НЕ откатывает вашу транзакцию; предыдущие изменения, внесенные вами во время транзакции, по-прежнему могут быть зафиксированы. Вы даже можете попробовать запрос, для которого время ожидания истекло снова.

Исключение: в случае тупика InnoDB выбирает одну из транзакций, вовлеченных в тупик, и принудительно выполняет откат для одной из них. Он пытается выбрать транзакцию, которая изменила меньше строк. Если транзакции связаны, то выбор произвольный.

...