InnoDB использует optimisti c блокировку.
Нет блокировки в начале транзакции. Как он узнает, какие строки нужно заблокировать, пока вы не выполните специальный запрос c? Он даже не знает, в какой таблице (таблицах) вам в конечном итоге понадобится заблокировать строки.
Нет необходимости в откате после конфликта блокировок. Если вы выполняете запрос в одной транзакции, которая должна ждать, потому что другой сеанс удерживает блокировку, тогда ваш запрос ожидает до определенного количества секунд (в соответствии с параметром конфигурации innodb_lock_wait_timeout
, по умолчанию 50 секунд).
- Если другой сеанс фиксируется до истечения времени ожидания, тогда ваш сеанс прекращает ожидание, получает необходимые блокировки и переходит к запросу.
- Если время ожидания истекает до фиксации другого сеанса, ваш запрос возвращается ошибка. Это по-прежнему НЕ откатывает вашу транзакцию; предыдущие изменения, внесенные вами во время транзакции, по-прежнему могут быть зафиксированы. Вы даже можете попробовать запрос, для которого время ожидания истекло снова.
Исключение: в случае тупика InnoDB выбирает одну из транзакций, вовлеченных в тупик, и принудительно выполняет откат для одной из них. Он пытается выбрать транзакцию, которая изменила меньше строк. Если транзакции связаны, то выбор произвольный.