[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-kakie-urovni-izolyatsii-tranzaktsiy-podderzhivaet-postgresql":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},945,"kakie-urovni-izolyatsii-tranzaktsiy-podderzhivaet-postgresql",28,"postgresql","PostgreSQL","🐘","Какие уровни изоляции транзакций поддерживает PostgreSQL?","PostgreSQL поддерживает четыре уровня изоляции в соответствии со стандартом SQL, но реализует их через MVCC — без блокировок для чтения. Фактически уникальных поведений три, поскольку READ UNCOMMITTED работает идентично READ COMMITTED.\n\n| Уровень | Грязное чтение | Неповторяемое чтение | Фантомное чтение | Аномалия сериализации |\n|---|---|---|---|---|\n| `READ UNCOMMITTED` | Невозможно* | Возможно | Возможно | Возможно |\n| `READ COMMITTED` | Невозможно | Возможно | Возможно | Возможно |\n| `REPEATABLE READ` | Невозможно | Невозможно | Невозможно** | Возможно |\n| `SERIALIZABLE` | Невозможно | Невозможно | Невозможно | Невозможно |\n\n(*) В PostgreSQL `READ UNCOMMITTED` работает идентично `READ COMMITTED` — грязное чтение невозможно благодаря MVCC.\n\n(**) В PostgreSQL на уровне `REPEATABLE READ` фантомное чтение также невозможно (в отличие от стандарта SQL, где оно допустимо).\n\n### READ COMMITTED (по умолчанию)\n\nКаждый оператор видит данные, зафиксированные до начала этого оператора. Два одинаковых SELECT в одной транзакции могут вернуть разные результаты.\n\n### REPEATABLE READ\n\nТранзакция видит данные, зафиксированные до начала транзакции. При попытке обновить строку, изменённую другой транзакцией, выбрасывается ошибка сериализации — нужно повторить транзакцию.\n\n### SERIALIZABLE\n\nГарантирует, что результат параллельного выполнения транзакций эквивалентен некоторому последовательному выполнению. Использует механизм Serializable Snapshot Isolation (SSI). При конфликте одна из транзакций откатывается — приложение должно быть готово к повторной попытке.\n\n```java\n\u002F\u002F Spring — повторная попытка при ошибке сериализации\n@Transactional(isolation = Isolation.SERIALIZABLE)\n@Retryable(value = CannotSerializeTransactionException.class, maxAttempts = 3)\npublic void criticalOperation() {\n    \u002F\u002F ...\n}\n```\n\n> **На собеседовании:** ключевой ответ про PostgreSQL — грязное чтение невозможно даже на READ UNCOMMITTED (благодаря MVCC), а фантомное чтение невозможно уже на REPEATABLE READ (строже стандарта SQL). Обязательно упомяните, что при SERIALIZABLE приложение должно уметь повторять транзакции.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Какие уровни изоляции транзакций поддерживает PostgreSQL? — Gymterview","PostgreSQL поддерживает четыре уровня изоляции в соответствии со стандартом SQL, но реализует их через MVCC — без блокировок для чтения. Фактически уникальных п","PostgreSQL поддерживает четыре уровня изоляции в соответствии со стандартом SQL, но реализует их через MVCC — без блокир",[7,13],"PostgreSQL поддерживает четыре уровня изоляции в соответствии со стандартом SQL, но реализует их через MVCC — без блокировок для чтения. Фактически уникальных поведений три, поскольку READ UNCOMMITTED работает идентично READ COMMITTED.",true]