← Назад к вопросам

Что гарантируют уровни изоляций транзакции

1.2 Junior🔥 141 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Уровни изоляции транзакций

Уровни изоляции транзакций — это механизм управления конкурентностью в базах данных, который определяет, как одновременно выполняемые транзакции взаимодействуют между собой и какие гарантии они получают.

Четыре основных уровня

1. READ UNCOMMITTED (Грязное чтение)

Самый низкий уровень изоляции. Транзакция может читать незафиксированные данные другой транзакции. Это может привести к чтению некорректных данных, если первая транзакция откатится.

// Транзакция A
begin transaction
update account set balance = balance - 100 where id = 1;
// Транзакция B может видеть этот минус, даже если A откатится

2. READ COMMITTED (Неповторяющееся чтение)

Транзакция может читать только зафиксированные данные других транзакций. Однако, если во время выполнения одна транзакция изменит данные, другая может получить другое значение при повторном чтении.

Transaction A:
read account.balance (value = 1000);
Transaction B:
update account set balance = 1500 where id = 1;
commit;
Transaction A:
read account.balance (value = 1500); // Другое значение!

3. REPEATABLE READ (Привидение, фантомные строки)

Транзакция гарантирует, что если она прочитала данные, при повторном чтении в той же транзакции она получит те же значения. Однако возможны фантомные строки — новые строки, добавленные другой транзакцией.

// Транзакция A выполняет SELECT с WHERE условием
select count(*) from orders where user_id = 5;
// Результат: 10

// Транзакция B добавляет новый order
insert into orders (user_id) values (5);
commit;

// Транзакция A повторно выполняет тот же SELECT
select count(*) from orders where user_id = 5;
// Результат: 11 — появилась фантомная строка!

4. SERIALIZABLE (Полная изоляция)

Самый строгий уровень. Гарантирует, что транзакции выполняются так, как будто они идут последовательно, одна за другой. Исключаются грязное чтение, неповторяющееся чтение и фантомные строки.

// Полная безопасность, но низкая производительность
// Используется редко из-за высокого числа блокировок

Проблемы, которые решают уровни

ПроблемаREAD UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE
Грязное чтениеВозможно
Неповторяющееся чтениеВозможноВозможно
Фантомные строкиВозможноВозможноВозможно

В Java (Hibernate/JPA)

@Transactional(isolation = Isolation.READ_COMMITTED)
public void transferMoney(int fromAccount, int toAccount, BigDecimal amount) {
    // Код выполняется с READ_COMMITTED уровнем
}

@Transactional(isolation = Isolation.SERIALIZABLE)
public void criticalOperation() {
    // Максимальная безопасность, но медленнее
}

Выбор уровня

  • READ UNCOMMITTED — редко используется, только для некритичных операций
  • READ COMMITTED — стандартный уровень в большинстве БД (PostgreSQL, MySQL)
  • REPEATABLE READ — для операций, требующих консистентности одного набора данных
  • SERIALIZABLE — для критичных финансовых операций

Ключевая компромисс: чем выше уровень изоляции, тем безопаснее данные, но медленнее работает система из-за большего числа блокировок.