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