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