[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-bazy-dannykh-kakie-problemy-mogut-voznikat-pri-parallelnom-dostupe-s-ispolzovaniem-tranzaktsiy":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":17,"progress":18,"seo":19},1144,"kakie-problemy-mogut-voznikat-pri-parallelnom-dostupe-s-ispolzovaniem-tranzaktsiy",35,"bazy-dannykh","Базы данных","🗄️","Какие проблемы могут возникать при параллельном доступе с использованием транзакций?","При параллельном выполнении транзакций возникают аномалии чтения и записи, которые могут привести к некорректным результатам. Стандарт SQL определяет четыре основных типа аномалий.\n\n### Потерянное обновление (Lost Update)\n\nДве транзакции одновременно читают одно значение и записывают свои изменения. Последняя запись перезатирает первую.\n\n```\nT1: READ balance = 100\nT2: READ balance = 100\nT1: WRITE balance = 100 + 50 = 150\nT2: WRITE balance = 100 - 30 = 70     ← изменение T1 потеряно\n```\n\nРезультат: баланс = 70 вместо ожидаемых 120. Предотвращается на всех уровнях изоляции (через блокировки или MVCC).\n\n### Грязное чтение (Dirty Read)\n\nТранзакция читает данные, изменённые другой транзакцией, которая ещё не зафиксирована и может быть откачена.\n\n```\nT1: UPDATE balance = 50    (не зафиксировано)\nT2: READ balance = 50      ← грязное чтение\nT1: ROLLBACK               ← balance вернулся к 100\nT2: использует значение 50  ← некорректное\n```\n\nПредотвращается на уровне Read Committed и выше.\n\n### Неповторяемое чтение (Non-Repeatable Read)\n\nТранзакция дважды читает одну строку и получает разные значения, потому что между чтениями другая транзакция изменила и зафиксировала данные.\n\n```\nT1: READ balance = 100\nT2: UPDATE balance = 200\nT2: COMMIT\nT1: READ balance = 200     ← значение изменилось\n```\n\nПредотвращается на уровне Repeatable Read и выше.\n\n### Фантомное чтение (Phantom Read)\n\nТранзакция дважды выполняет запрос с одним условием и получает разное количество строк, потому что между запросами другая транзакция добавила или удалила строки.\n\n```\nT1: SELECT COUNT(*) FROM orders WHERE status = 'new'  → 5\nT2: INSERT INTO orders (status) VALUES ('new')\nT2: COMMIT\nT1: SELECT COUNT(*) FROM orders WHERE status = 'new'  → 6  ← фантом\n```\n\nОтличие от неповторяемого чтения: неповторяемое чтение — изменение существующих строк, фантом — появление или исчезновение строк.\n\nПредотвращается на уровне Serializable (или Repeatable Read в PostgreSQL).\n\n### Сводная таблица\n\n| Аномалия | Суть | Минимальный уровень защиты |\n|----------|------|---------------------------|\n| Потерянное обновление | Перезатирание чужих изменений | Read Uncommitted |\n| Грязное чтение | Чтение незафиксированных данных | Read Committed |\n| Неповторяемое чтение | Изменение ранее прочитанных строк | Repeatable Read |\n| Фантомное чтение | Появление\u002Fисчезновение строк | Serializable |\n\n### Пример фантомного чтения (SQL)\n\n| Транзакция 1 | Транзакция 2 |\n|--------------|--------------|\n| | `SELECT SUM(f2) FROM tbl1;` |\n| `INSERT INTO tbl1 (f1,f2) VALUES (15,20);` | |\n| `COMMIT;` | |\n| | `SELECT SUM(f2) FROM tbl1;` -- другой результат |\n\nВторой SELECT в Транзакции 2 возвращает другую сумму, потому что появилась новая строка (фантом).\n\n> **На собеседовании:** интервьюер хочет, чтобы кандидат объяснил каждую аномалию с примером и знал, какой уровень изоляции от какой аномалии защищает. Частая ошибка — путать неповторяемое чтение (изменение строки) и фантомное чтение (появление\u002Fисчезновение строк).","","middle",[15,16],"databases","concurrency",[],null,{"title":20,"description":21,"ogTitle":22,"ogDescription":23,"keywords":24,"schemaAnswer":34,"featuredSnippetReady":35},"Проблемы параллельного доступа в транзакциях — Gymterview","Аномалии параллельного доступа: потерянное обновление (Lost Update), грязное чтение (Dirty Read), неповторяемое чтение, фантомное чтение. Уровни защиты от каждой.","Аномалии параллельного доступа: Dirty Read, Phantom Read, Lost Update — Gymterview","Четыре аномалии параллельных транзакций: потерянное обновление, грязное, неповторяемое и фантомное чтение.",[25,26,27,28,29,30,31,32,33],"dirty read","phantom read","non-repeatable read","lost update","грязное чтение","фантомное чтение","неповторяемое чтение","потерянное обновление","транзакции","Четыре основных аномалии: потерянное обновление (две транзакции перезатирают изменения друг друга), грязное чтение (чтение незафиксированных данных), неповторяемое чтение (значение строки меняется между двумя чтениями), фантомное чтение (появление\u002Fисчезновение строк между запросами). Каждая аномалия предотвращается соответствующим уровнем изоляции.",true]