292
правки
Изменения
→Согласованность и изоляция
== Согласованность и изоляция ==
В базах данных различают разные уровни изоляции (isolation level), максимальный уровень — сериализуемость (serializability).
Это когда все транзакции можно упорядочить и получить согласованную историю, как если бы они выполнялись последовательно.
Можно брать блокировку сразу на все узлы, но это не очень эффективно и распределённая блокировка — это сложно, поэтому обычно дают блокировки разным данным в пределах одного узла.
Чтобы сделать транзакцию, надо взять нужные блокировки (даже на чтение) и отпустить их, но при этом не вляпаться во взаимные блокировки или несогласованность (по-факту то транзакция не мгновенная).
Для этого используется [[2 Phase Locking|алгоритм двухфазной блокировки]].
Более сложная штука — MVCC (MultiVersion Concurrency Control), это когда мы для каждой транзакции создаём "снимок" базы данных (наверняка при помощи персистентных структур данных)
и дальше транзакция работает с ним.
Например, в транзакциях только на чтение это позволяет экономить блокировки.
А если появились записи, то надо как-то пробовать решать конфликты или даже просто откатывать транзакцию, если данные, которые она читала, уже кем-то были изменены.
== Подтверждение транзакции в распределённой системе ==
Блокировки у нас локальны и берутся просто, но нам надо, чтобы все участники атомарно пришли к решению завершать транзакцию.
Можно использовать алгоритмы распределённого консенсуса, но они сложные.
Классическое решение в базах данных — [[2 Phase Locking|алгоритм двухфазного коммита]] (не имеет никакого отношения к двухфазной блокировке).