Транзакции базы данных - Как они работают?

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

ACID практическое правило:

Транзакция должна быть:

  1. Атомарной - это одна единица работы и не зависит от предыдущих и следующие транзакции.
  2. Согласован - данные либо фиксируются, либо откатываются, нет «Промежуточный» случай, когда что-то был обновлен, а что-то не обновлено.
  3. Изолировано - ни одна транзакция не видит промежуточные результаты текущего транзакция.
  4. Долговечный - значения сохраняются, если данные были зафиксированы, даже если сразу после этого происходит сбой системы.

Мне было интересно, как они работают под капотом, чтобы я мог лучше понять факторы, которые необходимо учитывать при написании такой транзакции. Я предполагаю, что конкретные детали будут различаться в зависимости от доступных реализаций базы данных, но определенные правила будут всегда.

  1. Как база данных обрабатывает параллельные транзакции, все еще поддерживая атомарное правило?
    • Есть ли очередь транзакций, которая обрабатывается по порядку?
    • Как обрабатывается длинная транзакция, которая задерживает все остальные?
  2. Выполняются ли обновления таблиц в памяти, поэтому, если сбой происходит до фиксации, нет переделки в базе?
    • Или есть какие-то промежуточные таблицы, которые обновляются, чтобы пережить такой сбой?
  3. Во время выполнения транзакции запрещен ли доступ для чтения и записи к затронутым таблицам?
    • Или база данных разрешает запись, но транзакция перезаписывает все изменения при фиксации?
33
задан johnnyRose 26 November 2018 в 20:56
поделиться

4 ответа

  1. Существует множество различных способов, включая постановку транзакций в очередь, оптимистичное управление параллелизмом и т.д. На самом деле это очень сложный вопрос, об этом написаны книги:

    http://www.amazon.co.uk/Databases-Transaction-Processing-Application-Oriented-Approach/dp/0201708728/ref=sr_1_3?ie=UTF8&s=books&qid=1281609705&sr=8-3

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

  3. Это зависит от типа параллелизма. Оптимистический параллелизм не предполагает блокировок, но если состояние базы данных изменилось после завершения транзакции, то она завершается и запускается заново. Это может ускорить работу БД, где коллизии редки. Существуют также различные уровни блокировки: строка, таблица или даже вся база данных.

Это очень сложные вопросы, я бы посоветовал купить книгу или посетить цикл лекций по параллельным системам, если вы хотите быть в состоянии полностью ответить на них :-)

.
13
ответ дан 27 November 2019 в 19:28
поделиться

Несколько придирок к вашим определениям:

Атомарный - это одна единица работы, не зависящая от предыдущих и последующих транзакций.

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

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

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

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

Изолированный - ни одна транзакция не видит промежуточные результаты текущей транзакции.

Nitpicking: никакая транзакция , кроме текущей , не может видеть промежуточные состояния (состояния, а не результаты). Обратите внимание, что «уровни изоляции» механизмов обработки транзакций обычно определяют степень, в которой свойство I может быть нарушено!

Долговечный - значения сохраняются, если данные были зафиксированы, даже если сразу после этого произойдет сбой системы.

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

10
ответ дан 27 November 2019 в 19:28
поделиться

Фактические детали, вероятно, будут в некоторой степени зависеть от того, какой это сервер DB, но эта статья может быть вам интересна: Transaction Processing Cheat Sheet

6
ответ дан 27 November 2019 в 19:28
поделиться

"Каков вердикт по поводу вложенных транзакций"

Вердикта нет. Вложенные транзакции существуют. Свойства ACID существуют. Они вынуждены сосуществовать. Абсолютов не существует. Определенно не для ACID.

0
ответ дан 27 November 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: