1632
правки
Изменения
м
rollbackEdits.php mass rollback
[[Категория: Параллельное программирование]]
== Зачем ==
# '''A'''tomicity (атомарность) — транзакция либо полностью '''применила''' все свои изменения, либо полностью '''откатилась''' (отменилась)
# '''C'''onsitency (согласованность) — в конце транзакции система находится в согласованном состоянии
# '''I'''solation (изолированность) — параллельные транзакции не должны влиять друг на друга (например, при помощи phantom reads и non-repeatable reads), а должны выполняться как будто последовательно
# '''D'''urability (надёжность) — завершённые (commited) транзакции сохраняются даже в случае сбоев и перезапуска системы
== Согласованность и изоляция ==
В базах данных различают разные уровни изоляции (isolation level), максимальный уровень — сериализуемость (serializability).
Это когда все транзакции можно упорядочить и получить согласованную историю, как если бы они выполнялись последовательно.
Можно брать блокировку сразу на все узлы, но это не очень эффективно и распределённая блокировка — это сложно, поэтому обычно дают блокировки разным данным в пределах одного узла.
Чтобы сделать транзакцию, надо взять нужные блокировки (даже на чтение) и отпустить их, но при этом не вляпаться во взаимные блокировки или несогласованность (по-факту то транзакция не мгновенная).
Для этого используется [[2 Phase Locking|алгоритм двухфазной блокировки]].
Более сложная штука — MVCC (MultiVersion Concurrency Control), это когда мы для каждой транзакции создаём "снимок" базы данных (наверняка при помощи персистентных структур данных)
и дальше транзакция работает с ним.
Например, в транзакциях только на чтение это позволяет экономить блокировки.
А если появились записи, то надо как-то пробовать решать конфликты или даже просто откатывать транзакцию, если данные, которые она читала, уже кем-то были изменены.
== Подтверждение транзакции в распределённой системе ==
Блокировки у нас локальны и берутся просто, но нам надо, чтобы все участники атомарно пришли к решению завершать транзакцию.
Можно использовать алгоритмы распределённого консенсуса, но они сложные.
Классическое решение в базах данных — [[2 Phase Commit|алгоритм двухфазного коммита]] (не имеет никакого отношения к двухфазной блокировке).