Что такое уровень изоляции транзакций READ COMMITTED?

«Что такое уровень изоляции транзакций READ COMMITTED?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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). Он обеспечивает хороший баланс между целостностью данных и производительностью, устраняя самый критичный артефакт — грязное чтение.