Какие знаешь уровни изоляции транзакции

Python Middle Без компании
Какие знаешь уровни изоляции транзакции
Ответы
**Уровень изоляции** определяет, как транзакции могут взаимодействовать между собой, и насколько сильно могут пересекаться и мешать друг другу при параллельной работе. Иначе говоря, разные уровни изоляции допускают или не допускают разные аномалии при параллельной работе транзакций (про аномалии расскажем дальше). **Основные 4 уровня изоляции:** **READ UNCOMMITTED** READ UNCOMMITTED - это самый слабый уровень изоляции, когда транзакция может видеть результаты других транзакций, даже если они ещё не закоммичены. **Он допускает:** - Грязное чтение - Неповторяющееся чтение - Фантомное чтение По факту, на этом уровне изоляция отсутствует. Где-нибудь в аналитике больших данных такой уровень может ещё использоваться, где нам не так важна точность данных, но это достаточно редко. **READ COMMITTED** READ COMMITTED - на этом уровне транзакция может читать только те изменения в других параллельных транзакциях, которые уже были закоммичены. **Он предотвращает:** - Грязное чтение **Но он допускает:** - Неповторяющееся чтение - Фантомное чтение Такой уровень по умолчанию используется, например, в PostgreSQL и Oracle. **REPEATABLE READ** REPEATABLE READ - этот уровень означает, что пока транзакция не завершится, никто параллельно не может изменять или удалять строки, которые транзакция уже прочитала. Т. е. данные, которые я прочитал своей транзакцией, точно никто не изменит, пока я не завершу свою транзакцию (по крайней мере, в классическом понимании этого уровня с блокировками). **Он предотвращает:** - Неповторяющееся чтение - Грязное чтение **Но он допускает:** - Фантомное чтение Используется по умолчанию в MySQL. **SERIALIZABLE** SERIALIZABLE - самый жёсткий, но самый тяжёлый для БД и медленный для обработки запросов уровень. Он блокирует любые действия, пока запущена транзакция - получается, транзакции идут строго одна за другой и максимально изолируются друг от друга. Это достигается с помощью блокировки всей таблицы от любых взаимодействий с ней, но некоторые СУБД делают менее радикально - блокируют только те строки, которые задействует текущая транзакция или диапазон строк. **Предотвращает все аномалии:** - Неповторяющееся чтение - Грязное чтение - Фантомное чтение Но страдает производительность из-за того, что транзакции не могут работать параллельно. **Зачем нам все эти уровни?** Почему не обойтись каким-нибудь самым безопасным SERIALIZABLE, который не допускает никаких аномалий, или каким-нибудь среднячком READ COMMITED? Потому что в реальной жизни бизнесовые задачи бывают совсем разные: где-то нам важно сохранять максимальную целостность данных и изолировать транзакции так, чтобы они не пересекались друг с другом, т. к. при конфликте или ошибке цена будет велика, а где-то мы можем смириться с какими-то кейсами нестыковок в данных, но зато у нас будет производительность - мы сможем запускать больше транзакций одновременно.