Ответ
READ COMMITTED — это один из стандартных уровней изоляции транзакций в реляционных СУБД. Его основное правило: транзакция видит только те данные, которые были успешно зафиксированы (COMMIT) другими транзакциями на момент выполнения каждого отдельного оператора SELECT.
Что он гарантирует и допускает:
- Предотвращает: "Грязное чтение" (Dirty Read) — чтение незафиксированных данных, которые могут быть откатаны.
- Допускает:
- Неповторяемое чтение (Non-repeatable Read): Повторное чтение одной и той же строки в рамках транзакции может вернуть разные данные, если другая транзакция её изменила и зафиксировала.
- Фантомное чтение (Phantom Read): Появление новых строк, удовлетворяющих условию запроса, из-за вставок других зафиксированных транзакций.
Пример сценария в PostgreSQL:
-- Сессия 1
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
UPDATE users SET score = 100 WHERE id = 1; -- Изменение не зафиксировано
-- Сессия 2
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT score FROM users WHERE id = 1; -- Увидит СТАРОЕ значение (грязное чтение предотвращено)
-- Сессия 1
COMMIT; -- Фиксируем изменение
-- Сессия 2 (тот же оператор, но после COMMIT в сессии 1)
SELECT score FROM users WHERE id = 1; -- Теперь увидит НОВОЕ значение (100) - это неповторяемое чтение
COMMIT;
На практике READ COMMITTED — это часто уровень изоляции по умолчанию (например, в PostgreSQL, Oracle). Он обеспечивает хороший баланс между целостностью данных и производительностью, устраняя самый критичный артефакт — грязное чтение.
Ответ 18+ 🔞
А, ну это про транзакции, классика! Слушай, представь себе ситуацию. Допустим, ты в баре, и у тебя на столе лежит сотка. Ты её видишь, я её вижу. Это как данные в базе, которые все уже закоммитили, всё честно.
Так вот, READ COMMITTED — это такой принципиальный мужик. Его главный принцип: «Пока деньги на стол не положили — нихуя не видел». То есть, если я только собираюсь тебе дать сотку, достал кошелёк, но ещё не вынул — ты её не видишь. Ты видишь только то, что уже реально лежит на столе. Это и есть защита от «грязного чтения» — ты не увидишь мои незавершённые дела, которые я ещё могу передумать делать и кошелёк обратно засунуть.
Но есть подвох, ёпта! Допустим, ты отвлёкся на минуту, посмотрел в телефон. А я в этот момент быстренько свою сотку на стол таки положил. Ты опять смотришь на стол — а там уже лежит! Ты только что видел, что её нет, а теперь она есть. Вот это и есть неповторяемое чтение: один и тот же запрос («что на столе?») в рамках одной твоей «транзакции» (пока ты сидишь за этим столом) дал разные результаты.
А если я не просто положил деньги, а ещё и позвал друга, и он тоже пришёл и сел за твой стол? Ты сначала видел одного человека (себя), а теперь вас двое. Это фантомное чтение — появились новые строки, которых раньше не было.
Короче, что он гарантирует:
- Не увидишь херни (грязное чтение). Не будет такого, что ты увидел мои 100 рублей, я их взял обратно, а ты уже пошёл на них пиво покупать — облом.
- Но жизнь вокруг идёт (неповторяемое и фантомное). Пока ты тут сидишь, мир не замирает. Данные могут меняться, новые — появляться. Ты это увидишь, если посмотришь ещё раз.
Пример из жизни PostgreSQL:
-- Я (Сессия 1). Начинаю дело.
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
UPDATE users SET score = 100 WHERE id = 1; -- Мысленно кладу сотку на стол. Но ещё не сказал "всё, оставляю".
-- Ты (Сессия 2). Тоже начинаешь своё наблюдение.
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT score FROM users WHERE id = 1; -- Смотришь на стол. И видишь там старый score, скажем, 50. Моей сотки ты НЕ ВИДИШЬ! Всё честно.
-- Я (Сессия 1). Решаю, что всё-таки оставляю.
COMMIT; -- Говорю: "Всё, деньги твои, забирай". Кладу их на стол.
-- Ты (Сессия 2). Снова смотришь на то же самое место.
SELECT score FROM users WHERE id = 1; -- Опа, а теперь уже видишь 100! Вот тебе и неповторяемое чтение в чистом виде. В рамках своей транзакции ты получил два разных ответа.
COMMIT;
На практике этот уровень — как золотая середина. READ COMMITTED — часто уровень по умолчанию, потому что он, с одной стороны, не даёт увидеть откровенный пиздец (незакоммиченные данные), а с другой — не душит систему нахуй, как более строгие уровни. Баланс между «чтобы не обосраться» и «чтобы всё летало». Работает, блядь, в большинстве случаев, если, конечно, твоё приложение не требует, чтобы мир вокруг него замер на время его транзакции.