Ответ
Изолированность — это одно из четырёх свойств ACID, которое гарантирует, что параллельно выполняющиеся транзакции не влияют друг на друга так, как будто они выполняются последовательно. Это предотвращает возникновение аномалий чтения и записи.
Основные уровни изолированности (от самого слабого к самому строгому):
- Read Uncommitted (Чтение незафиксированных данных): Транзакция видит незафиксированные изменения других транзакций. Возможна грязное чтение (Dirty Read).
- Read Committed (Чтение зафиксированных данных): Транзакция видит только те изменения, которые были зафиксированы другими транзакциями к моменту её выполнения. Исключает грязное чтение, но возможны неповторяемое чтение (Non-repeatable Read) и фантомное чтение (Phantom Read).
- Repeatable Read (Повторяемое чтение): Гарантирует, что данные, прочитанные в начале транзакции, не изменятся другими транзакциями до её завершения. Исключает неповторяемое чтение, но фантомное чтение всё ещё возможно.
- Serializable (Сериализуемость): Самый строгий уровень. Транзакции выполняются так, как будто они идут строго последовательно, одна за другой. Исключает все основные аномалии.
Пример аномалии "Грязное чтение" на уровне Read Uncommitted:
-- Транзакция 1 (обновляет баланс, но не фиксирует)
BEGIN TRANSACTION;
UPDATE accounts SET balance = 150 WHERE user_id = 1;
-- Баланс теперь 150, но транзакция НЕ зафиксирована.
-- Транзакция 2 (читает незафиксированные данные)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT balance FROM accounts WHERE user_id = 1; -- Увидит 150!
-- Транзакция 1 откатывается
ROLLBACK;
-- Фактический баланс остался 100, но Транзакция 2 уже прочитала несуществующее значение 150.
На практике чаще всего используется уровень Read Committed (по умолчанию в PostgreSQL, SQL Server) или Repeatable Read (по умолчанию в MySQL InnoDB). Выбор уровня — это компромисс между строгостью изоляции и производительностью.