Назад к вопросам
Middle
92
questionbank

Какие уровни изоляции транзакций в базах данных ты знаешь?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В SQL стандарте определены четыре уровня изоляции транзакций: Read Uncommitted, Read Committed, Repeatable Read, Serializable.

  1. Read Uncommitted: Самый низкий уровень. Транзакция может читать данные, которые еще не зафиксированы (т.е. выполненные другой транзакцией, которая еще не завершена COMMIT). Это приводит к "грязным" чтениям (dirty reads).

  2. Read Committed: Транзакция видит только те данные, которые были зафиксированы до начала или во время ее выполнения. Предотвращает "грязные" чтения, но допускает неповторяющиеся чтения (non-repeatable reads) и фантомы (phantom reads).

    • Неповторяющиеся чтения: Одно и то же чтение в рамках одной транзакции возвращает разные данные, потому что другая транзакция между чтениями изменила и зафиксировала их.
    • Фантомы: При выполнении запроса с WHERE условием, вторая транзакция добавляет или удаляет строки, соответствующие условию, и повторное выполнение того же запроса внутри первой транзакции возвращает другой набор строк.
  3. Repeatable Read: Транзакция видит только те данные, которые были зафиксированы до ее начала. Гарантирует, что повторные чтения одних и тех же строк в рамках одной транзакции вернут одинаковые данные. Предотвращает "грязные" и неповторяющиеся чтения. Допускает фантомы.

    // Пример Repeatable Read
    // Транзакция 1
    // BEGIN TRANSACTION;
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Например, 100
    
    // Транзакция 2 (выполняется одновременно)
    // BEGIN TRANSACTION;
    // INSERT INTO users (name, status) VALUES ('Новый пользователь', 'active');
    // COMMIT;
    
    // Транзакция 1
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Все еще 100 (фантом)
    // COMMIT;
    
  4. Serializable: Самый высокий уровень изоляции. Гарантирует, что параллельное выполнение транзакций будет эквивалентно некоторому последовательному выполнению этих транзакций. Предотвращает "грязные" чтения, неповторяющиеся чтения и фантомы. Может приводить к снижению производительности из-за блокировок.

В разных СУБД могут быть свои реализации и особенности уровней изоляции, а также дополнительные уровни. Например, в MySQL InnoDB является Repeatable Read по умолчанию.