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

Приведи примеры типов изоляции транзакций

2.0 Middle🔥 162 комментариев
#Основы Go

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Примеры типов изоляции транзакций в базах данных

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

Основные уровни изоляции

1. Read Uncommitted (Чтение незафиксированных данных)

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

-- Пример в PostgreSQL (не поддерживается напрямую, но демонстрирует концепцию)
-- Транзакция A
BEGIN;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 1;

-- Транзакция B (Read Uncommitted)
BEGIN;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT balance FROM accounts WHERE user_id = 1; -- Может увидеть +100, даже если транзакция A еще не завершилась
COMMIT;

2. Read Committed (Чтение зафиксированных данных)

Транзакция видит только данные, которые были успешно зафиксированы другими транзакциями. Грязное чтение предотвращается, но возможны "неповторяемое чтение" (Non-repeatable Read).

-- Пример в PostgreSQL (дефолтный уровень)
-- Транзакция A
BEGIN;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 1;
COMMIT;

-- Транзакция B
BEGIN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT balance FROM accounts WHERE user_id = 1; -- Первое чтение: старый баланс
-- Транзакция A коммитится
SELECT balance FROM accounts WHERE user_id = 1; -- Второе чтение: новый баланс (неповторяемое чтение)
COMMIT;

3. Repeatable Read (Повторяемое чтение)

Транзакция гарантирует, что все чтения данных будут возвращать одинаковые значения в течение всей транзакции. Предотвращает грязное чтение и неповторяемое чтение, но допускает "чтение фантомов" (Phantom Read).

-- Пример в MySQL/InnoDB
-- Транзакция A
START TRANSACTION;
SELECT * FROM accounts WHERE balance > 500; -- Возвращает 2 записи

-- Транзакция B
START TRANSACTION;
INSERT INTO accounts (user_id, balance) VALUES (3, 600);
COMMIT;

-- Транзакция A (продолжение)
SELECT * FROM accounts WHERE balance > 500; -- В Repeatable Read все еще 2 записи (фантомы не видны в некоторых реализациях)
COMMIT;

4. Serializable (Сериализуемый)

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

-- Пример в PostgreSQL
-- Транзакция A
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT SUM(balance) FROM accounts;

-- Транзакция B
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
INSERT INTO accounts (user_id, balance) VALUES (4, 300); -- Будет заблокировано или получит ошибку конфликта сериализации
COMMIT;

Практические различия в реализации

  • PostgreSQL: Полная поддержка всех четырех уровней. READ COMMITTED — дефолтный.
  • MySQL/InnoDB: REPEATABLE READ — дефолтный уровень. В реализации InnoDB он также предотвращает фантомы через механизм блокировок.
  • SQLite: Дефолтный уровень — SERIALIZABLE, поддерживается только он и READ UNCOMMITTED.

Проблемы параллельности, которые предотвращают уровни изоляции

  • Грязное чтение: Чтение незафиксированных изменений другой транзакции.
  • Неповторяемое чтение: Значение строки изменяется между двумя чтениями в одной транзакции.
  • Чтение фантомов: Появление новых строк между двумя чтениями в одной транзакции.

Выбор уровня изоляции зависит от требований приложения: более строгие уровни повышают консистентность, но снижают параллельность и производительность из-за блокировок или механизмов контроля версий (MVCC). Для финансовых систем часто используют REPEATABLE READ или SERIALIZABLE, для аналитических отчетов — READ COMMITTED.

Приведи примеры типов изоляции транзакций | PrepBro