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

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

Ответ

READ_COMMITTED — это уровень изоляции транзакций в SQL, который гарантирует, что транзакция видит только те данные, которые были зафиксированы к моменту начала ее выполнения или в процессе. Это предотвращает чтение "грязных" данных (Dirty Read).

Характеристики и проблемы:

  • Предотвращает: Dirty Read (чтение незафиксированных данных другой транзакции).
  • Допускает:
    • Non-repeatable Read (неповторяющееся чтение): Одна транзакция дважды читает одну строку и получает разные значения, потому что другая транзакция изменила и зафиксировала эту строку между чтениями.
    • Phantom Read (фантомное чтение): Одна транзакция дважды выполняет запрос с одним условием и получает разное количество строк, потому что другая транзакция добавила или удалила подходящие строки между запросами.

Практический пример:

-- Транзакция 1
BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE id = 1; -- Читает 100

-- Транзакция 2
BEGIN TRANSACTION;
UPDATE accounts SET balance = 200 WHERE id = 1;
COMMIT; -- Фиксирует изменение

-- Транзакция 1 (продолжение)
SELECT balance FROM accounts WHERE id = 1; -- Теперь читает 200 (Non-repeatable Read)
COMMIT;

READ_COMMITTED — это уровень изоляции по умолчанию в PostgreSQL, Oracle и SQL Server. Он обеспечивает хороший баланс между согласованностью данных и производительностью.