Что представляет собой транзакционный уровень, когда речь идет о системах баз данных? - PullRequest
2 голосов
/ 26 января 2012

Например, LevelDB не поддерживает транзакции с несколькими выписками. Я где-то читал, что вам придется иметь дело с теми, кто находится на «транзакционном уровне».

Что должен сделать этот слой, чтобы добавить поддержку транзакций в библиотеку более низкого уровня, которая не поддерживает транзакции?

Ответы [ 2 ]

1 голос
/ 22 августа 2015

Если ваша база данных однопоточная, вы можете сделать следующее:

  1. Использование пакетной функции leveldb: вместо переопределения старого ключа создайте новый.Также введите в журнал старое и новое значение ключа.

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

  3. Если транзакция зафиксирована, удалите старые ключи и удалите записи журнала для завершения фиксации.

Тогдау вас есть транзакция для однопоточного хранилища ключей / значений с использованием нескольких версий.

Если база данных многопоточная, вам нужно использовать MVCC (см. Omid, PostgreSQL, Wiredtiger, bsddb ...) и что-то вроде Precisely Serializable.Изоляция моментального снимка (PSSI).

1 голос
/ 27 января 2012

Существуют различные способы определения транзакций и существуют различные способы их реализации.Общим свойством транзакции является то, что она КИСЛОТА:

  • Атомность - все или ничего.Все задачи транзакции базы данных должны быть выполнены;Если по какой-либо причине причина неполная, транзакция базы данных должна быть прервана.
  • Согласованность - сериализуемость и целостность.База данных должна находиться в согласованном или легальном состоянии до и после транзакции базы данных.Это означает, что транзакция базы данных не должна нарушать ограничения целостности базы данных.
  • Изоляция Данные, используемые во время выполнения транзакции базы данных, не должны использоваться другой транзакцией базы данных, пока выполнение не будет завершено.Следовательно, частичные результаты незавершенной транзакции не должны использоваться для других транзакций, пока транзакция не будет успешно зафиксирована.Это также означает, что на выполнение транзакции не влияют операции базы данных других параллельных транзакций.
  • Долговечность Все модификации базы данных транзакции будут выполнены постоянными, даже если сбой системы произойдет после завершения транзакции.

Транзакция может иметь несколько состояний:

  • Активное состояние : она делится на две фазы.Начальная фаза: транзакция базы данных находится в этой фазе, в то время как ее операторы начинают выполняться.Этап частичной фиксации: транзакция базы данных вступает в эту фазу, когда выполняется ее последняя инструкция.На этом этапе транзакция базы данных завершила свое выполнение, но транзакция все еще может быть прервана, поскольку выходные данные выполнения могут временно находиться в основной памяти - событие, такое как аппаратный сбой, может стереть вывод.
  • Failed State : транзакция базы данных переходит в сбойное состояние, когда ее нормальное выполнение больше не может продолжаться из-за аппаратных или программных ошибок).
  • Aborted State :Транзакция базы данных, если СУБД определила ее как неудачную, переходит в прерванное состояние.Прерванная транзакция не должна влиять на базу данных, и поэтому любые изменения, внесенные в базу данных, должны быть отменены или в техническом плане отменены.База данных вернется в свое согласованное состояние после отмены прерванной транзакции.Схема восстановления СУБД отвечает за управление прерываниями транзакций.
  • Состояние фиксации : Транзакция базы данных переходит в состояние фиксации, когда на диск после успешного выполнения было записано достаточно информации.В этом состоянии на диск было записано так много информации, что эффекты, вызванные транзакцией, не могут быть отменены путем прерывания;даже когда происходит системный сбой, изменения, сделанные совершенной транзакцией, могут быть воссозданы при перезапуске системы.

LevelDB не поддерживает транзакции , однако он имеет некоторые свойства ACID:

  • Пакетные записи являются атомарными.
  • Согласованность зависит от вас.
  • Ограниченная поддержка изоляции.
  • Долговечность - настраиваемый параметр.

Итак ... вернемся к вашемувопрос:

Q:

Что должен сделать этот слой, чтобы добавить поддержку транзакций в библиотеку более низкого уровня, которая не поддерживает транзакции?

A: Это зависит от того, как вы определяете транзакцию.Если вы определяете транзакцию с вышеупомянутыми свойствами и хотите, чтобы ваши транзакции были ACID, вам нужно было бы выяснить, возможно ли это с помощью LevelDB (большинство свойств ACID интегрированы), а затем вам придетсянаписать обертку вокруг LevelDB, которая гарантирует, что состояния транзакций поддерживаются должным образом.Однако я не совсем уверен, что это сделает только обертка, поэтому вам, возможно, придется взять исходный код и изменить его на истинно транзакций поддержки.

...