Чтобы ускорить запросы в БД, несколько транзакций могут быть выполнены одновременно.Например, если кто-то запускает запрос на выборку по таблице для заработной платы сотрудников компании (каждый сотрудник идентифицируется по идентификатору), а другой меняет фамилию того, кто, например, женился, вы можете выполнить оба запроса одновременновремя, потому что они не мешают.
Но в других случаях даже инструкция SELECT может мешать другой инструкции.
Чтобы предотвратить непредвиденные результаты в транзакциях SQL, транзакции следуют за ACID-модель , что означает атомарность, согласованность, изоляцию и долговечность (дополнительную информацию читайте wikipedia ).
Допустим, транзакция 1 начинает что-то вычислять, а затем хочет записать результатыв таблицу А. Перед записью он блокирует все операторы SELECT в таблице А. В противном случае это будет противоречить требованию изоляции.Потому что если транзакция 2 начнется, пока 1 все еще пишет, результаты 2 зависят от того, куда 1 уже записана, а где нет.
Теперь она может даже создать dead-lock .Например, прежде чем транзакция 1 сможет записать последнее поле в таблице A, она все равно должна что-то записать в таблицу B, но транзакция 2 уже заблокировала таблицу B для безопасного чтения из нее после того, как она прочитала из A, и теперь у вас есть тупик.2 хочет прочитать из A, который заблокирован 1, поэтому он ждет 1, чтобы завершить, но 1 ждет 2, чтобы разблокировать таблицу B, чтобы завершить сам.
Чтобы решить эту проблему, одна стратегия состоит в откате определенных транзакцийпосле определенного времени ожидания.( больше здесь )
Так что это может быть чтение для вашего оператора select, чтобы получить превышение времени ожидания блокировки.
Но взаимная блокировка обычно просто происходитсовпадение, поэтому, если транзакция 2 была вынуждена откатить, транзакция 1 должна быть в состоянии завершиться, так что 2 сможет успешно завершиться при следующей попытке.