Транзакция в СУБД и ACID.

Транзакция в контексте баз данных — это концепция, которая обеспечивает целостность и согласованность данных.

Транзакция.

Транзакция — это набор операций с базой данных, объединенных в одну атомарную единицу работы. В БД транзакция это нескольких запросов, которые трактуются как единый запрос.

Окончанием транзакции может быть либо сохранение изменений (фиксация, commit) либо отмена изменений (откат, rollback).

ACID.

Транзакции должны отвечать набору требований ACID.

  1. Atomicity (Атомарность). Все операции в транзакции выполняются как единый блок. Логика «всё или ничего». Транзакция либо выполняется полностью либо не выполняется вовсе.
  1. Consistency (Согласованность). Транзакция приводит базу данных из одного согласованного состояния в другое. При завершении транзакции не должны быть нарушены ограничения накладываемые на данные (например constraints в БД). Согласованность подразумевает, что система будет переведена из одного корректного состояния в другое корректное.
  1. Isolation (Изолированность). Транзакции не влияют друг на друга во время своего выполнения. Параллельно выполняемые транзакции не должны влиять друг на друга, например менять данные которые использует другая транзакция. Результат выполнения параллельных транзакций должен быть таким, как если бы транзакции выполнялись последовательно. Для этого имеются несколько уровней изоляции транзакций.
  1. Durability (Устойчивость). Изменения, внесенные в базу данных в рамках транзакции, должны оставаться постоянными до тех пор, пока транзакция не будет отменена. После фиксации транзакции изменения не должны быть утеряны.

Типы транзакций

  • Последовательные (обычные)
  • Параллельные
  • Распределённые (используют несколько транзакционных систем)
 
 

Жизненный цикл транзакции

  1. Начало транзакции
  2. Выполнение операций (например, INSERT, UPDATE, DELETE)
  3. Завершение транзакции (COMMIT или ROLLBACK)

Механизмы для обеспечения изоляции транзакций друг от друга?

1. Блокировки (Locks)

Блокировки являются основным механизмом для обеспечения изоляции транзакций:

  • Пишущие блокировки (Write locks): предотвращают изменения данных.
  • Читательские блокировки (Read locks): предотвращают чтение данных.

Алгоритмы блокировок включают в себя:

  • Система блокировок: управление доступом к ресурсам.
  • Стратегии блокировок: выбор объектов для блокировки.

2. Изоляционные уровни транзакций

Различные уровни изоляции определяют степень изолированности транзакций:

  • READ UNCOMMITTED: самые слабые гарантии изоляции.
  • READ COMMITTED: предотвращает чтение незакоммитированных данных.
  • REPEATABLE READ: гарантирует повторное чтение без изменений.
  • SERIALIZABLE: обеспечивает сериализуемое поведение.

3. Снимки (Snapshots)

Некоторые системы используют концепцию снимков:

  • Все операции в рамках транзакции выполняются над копией данных на момент начала транзакции.
  • Обеспечивают высокую производительность за счет минимизации блокировок.

4. Многопоточная обработка (Multi-threading)

Современные базы данных часто используют многопоточную обработку:

  • Каждый поток может иметь свою собственную версию данных.
  • Используются алгоритмы синхронизации потоков для координации доступа.

5. Конфликты и разрешения конфликтов

Алгоритмы для обнаружения и разрешения конфликтов между транзакциями:

  • Детектирование конфликтов при записи.
  • Решение конфликтов путем отката одной или нескольких транзакций.

6. Оптимистичные и пессимистичные стратегии

Различные подходы к управлению блокировками:

  • Оптимистические: предполагают, что конфликта нет до его возникновения.
  • Пессимистические: предполагают наличие конфликта и блокируют ресурсы заранее.

7. Алгоритмы распределенных транзакций

Для систем распределенных баз данных:

  • Two-phase commit (2PC): координация транзакций между узлами.
  • Three-phase commit (3PC): улучшенная версия 2PC с дополнительными шагами.

Стоит учитывать:

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

Проблемы параллельного доступа с использованием транзакций.

1. Потерянное обновление (Lost Update)

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

Пример: Транзакция T1: UPDATE x SET y = 10 WHERE z = 5; Транзакция T2: UPDATE x SET y = 15 WHERE z = 5;

Если обе транзакции выполняются одновременно, результатом будет UPDATE x SET y = 15 WHERE z = 5, а не ожидаемое значение 10.

2. Грязное чтение (Dirty Read)

Это чтение данных, которые были изменены или удалены другой незавершенной транзакцией. Т.е. это чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится).

Пример: Транзакция T1: INSERT INTO x VALUES (1, 10); Транзакция T2: SELECT FROM x; // Читает данные из T1 Транзакция T1: ROLLBACK;

Результат: T2 получила несуществующие данные.

3. Неповторяемое чтение (Non-repeatable Read)

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

Пример: Транзакция T: SELECT * FROM x WHERE y = 5; // Данные верны UPDATE x SET y = 10 WHERE id = 1; SELECT * FROM x WHERE y = 5; // Результат отличается от первого запроса

4. Фантомное чтение (Phantom Read)

Это ситуация, когда одна транзакция в ходе своего выполнения несколько раз выбирает множество строк по одним и тем же критериям, но между выборками добавляются новые строки. И выборка даст разные множества строк.

Пример: T1: SELECT * FROM x WHERE y > 5; // Получает строки A и B INSERT INTO x VALUES (3, 20); T2: SELECT * FROM x WHERE y > 5; // Также получает строку C

 

4 вида уровней изоляции транзакций.

Под «уровнем изоляции транзакций» понимается степень обеспечиваемой внутренними механизмами СУБД защиты от всех или некоторых видов несогласованности данных, возникающих при параллельном выполнении транзакций. 

 

READ UNCOMMITTED

Низший (первый) уровень изоляции. Если несколько параллельных транзакций пытаются изменять одну и ту же строку таблицы, то в окончательном варианте строка будет иметь значение, определённое всем набором успешно выполненных транзакций. При этом возможно считывание не только логически несогласованных данных, но и данных, изменения которых ещё не зафиксированы.

Преимущества:

  • Наилучшая производительность благодаря минимальному количеству блокировок.
  • Подходит для отчетных запросов, которые не требуют актуальности данных.

Недостатки:

  • Может привести к «грязному чтению» (dirty read), «не повторяемому чтению» (non-repeatable read) и «фантомным чтениям» (phantom read).
  • Не обеспечивает консистентность данных.

READ COMMITTED

Зачастую многие СУБД по умолчанию используют именно этот уровень (PostgreSQL). На этом уровне обеспечивается защита от  «грязного» чтения, тем не менее, в процессе работы одной транзакции другая может быть успешно завершена и сделанные ею изменения зафиксированы. В итоге первая транзакция будет работать с другим набором данных.

Преимущества:

  • Улучшает производительность по сравнению с READ UNCOMMITTED.
  • Предотвращает «грязное чтение».

Недостатки:

  • Может все еще приводить к «не повторяемому чтению».
  • Может привести к «фантомным чтениям».

REPEATABLE READ

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

Блокировки в разделяющем режиме применяются ко всем данным, считываемым любой инструкцией транзакции, и сохраняются до её завершения. Это запрещает другим транзакциям изменять строки, которые были считаны незавершённой транзакцией. Однако другие транзакции могут вставлять новые строки, соответствующие условиям поиска инструкций, содержащихся в текущей транзакции. При повторном запуске инструкции текущей транзакцией будут извлечены новые строки, что приведёт к фантомному чтению. Учитывая то, что разделяющие блокировки сохраняются до завершения транзакции, а не снимаются в конце каждой инструкции, степень параллелизма ниже, чем при уровне изоляции READ COMMITTED. Поэтому пользоваться данным и более высокими уровнями изоляции транзакций без необходимости обычно не рекомендуется.

Преимущества:

  • Гарантирует, что транзакция увидит одни и те же данные при повторном чтении.
  • Предотвращает «грязное чтение» и «не повторяемое чтение».

Недостатки:

  • Может все еще приводить к «фантомным чтениям».
  • Может снижать производительность из-за более длительных блокировок.

SERIALIZABLE

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

Преимущества:

  • Наивысшая степень изоляции, обеспечивает полную атомарность транзакций.
  • Предотвращает все виды проблем с консистентностью данных.

Недостатки:

  • Наименьшая производительность из-за максимального количества блокировок.
  • Может значительно снижать параллелизм и производительность системы.

Резюмируем по уровням изоляции транзакций:

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

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *