Автор Тема: СУБД. Журнал транзакций.  (Прочитано 14796 раз)

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
СУБД. Журнал транзакций.
« : Апрель 13, 2012, 03:44:38 pm »
Вердикт такой:
СУБД либо ведет журнал транзакций, либо не отвечает требованиям ACID.
Что вы подразумеваете под журналом? Обычно, журнал - это Log. Журналал транзакций не обязателен, чтобы выполнять условия ACID. Или какое из условий по-вашему перестаёт удовлетвораться?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: СУБД. Журнал транзакций.
« Ответ #1 : Апрель 13, 2012, 03:50:43 pm »
Цитировать
Журналал транзакций не обязателен, чтобы выполнять условия ACID

Это как? Возможно я заблуждаюсь конечно, но я таких СУБД не знаю.

Кузнецов - Основы современных баз данных:
Цитировать
Журнал - это особая часть БД, недоступная пользователям СУБД и поддерживаемая с
особой тщательностью (иногда поддерживаются две копии журнала, располагаемые на
разных физических дисках), в которую поступают записи обо всех изменениях основной
части БД. В разных СУБД изменения БД журнализуются на разных уровнях: иногда
запись в журнале соответствует некоторой логической операции изменения БД (например,
операции удаления строки из таблицы реляционной БД), иногда - минимальной
внутренней операции модификации страницы внешней памяти; в некоторых системах
одновременно используются оба подхода. 
Во всех случаях придерживаются стратегии "упреждающей" записи в журнал (так
называемого протокола Write Ahead Log - WAL). Грубо говоря, эта стратегия заключается
в том, что запись об изменении любого объекта БД должна попасть во внешнюю память
журнала раньше, чем измененный объект попадет во внешнюю память основной части БД.
Известно, что если в СУБД корректно соблюдается протокол WAL, то с помощью
журнала можно решить все проблемы восстановления БД после любого сбоя. 
Самая простая ситуация восстановления - индивидуальный откат транзакции. Строго
говоря, для этого не требуется общесистемный журнал изменений БД. Достаточно для
каждой транзакции поддерживать локальный журнал операций модификации БД,
выполненных в этой транзакции, и производить откат транзакции путем выполнения
обратных операций, следуя от конца локального журнала. В некоторых СУБД так и
делают, но в большинстве систем локальные журналы не поддерживают, а
индивидуальный откат транзакции выполняют по общесистемному журналу, для чего все
записи от одной транзакции связывают обратным списком (от конца к началу). 

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: СУБД. Журнал транзакций.
« Ответ #2 : Апрель 13, 2012, 03:52:43 pm »
Или какое из условий по-вашему перестаёт удовлетвораться?
Целостность

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: СУБД. Журнал транзакций.
« Ответ #3 : Апрель 14, 2012, 08:27:04 pm »
Вообще-то, то, что у Кузнецова названо локальным журналом по сути является стеком. Для отката транзакций. Это не журнал, и журнал для этого не нужен. После завершения транзакции этот стек можно просто почистить. А при запуске после аварийного завершения откатить всё по стеку.

Про другие аварии в СУБД не знаю, поэтому не могу сказать, нужен ли там журнал.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: СУБД. Журнал транзакций.
« Ответ #4 : Апрель 14, 2012, 08:59:21 pm »
Все проще.  :)

Да. Журнал - это стек и есть.

Исторически просто выбран неудачный термин. Возможно за бугром слово Log несколько другую смысловую нагрузку несет нежели у нас. Не знаю. Но в литературе по теории баз данных механизм обеспечивающий откат транзакций называется логированием (или протоколированием).
см. Гарсиа Молина - Системы баз данных.

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

Кроме того журнал, помимо обеспечения отката нагружают и другими функциями (касающиеся надежности обычно).

Все это вносит некоторую путаницу.
Кузнецов использует слово "журнал", т.к. это уже общепринятый термин. Хоть и неудачный.

Мы просто привыкли что лог - это что-то сбоку, т.е. какие-то дополнительные сведения не связанные с алгоритмом (или просто сообщения о выполняемых действиях).

Но в случае транзакций журнал (версии) - это алгоритм и есть.
Нет журнала - нет отката и следовательно нет транзакции.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: СУБД. Журнал транзакций.
« Ответ #5 : Апрель 14, 2012, 09:06:55 pm »
Вот выдержка из книги "Системы баз данных"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: СУБД. Журнал транзакций.
« Ответ #6 : Апрель 14, 2012, 09:08:15 pm »
Упс. Не рассчитал  :(
valexey, можно исправить?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: СУБД. Журнал транзакций.
« Ответ #7 : Апрель 14, 2012, 09:29:28 pm »
Вот тут очень интересные сведения о журнале:
Семейство алгоритмов ARIES

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: СУБД. Журнал транзакций.
« Ответ #8 : Апрель 14, 2012, 09:44:43 pm »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: СУБД. Журнал транзакций.
« Ответ #9 : Апрель 14, 2012, 10:10:09 pm »
Вот от пионеров на ангельском (глава 6):
http://research.microsoft.com/en-us/people/philbe/ccontrol.aspx

alexus

  • Гость
Re: СУБД. Журнал транзакций.
« Ответ #10 : Апрель 15, 2012, 07:01:57 pm »
Читать надо... включая свои мозги...
Вот пример отрывок из статьи Козленко.... Весьма начитанная дама, но... думать умеет только в ограниченном коридоре... собственных догм
Цитировать
Блокирование или многоверсионность
Использование многоверсионности для обеспечения изолированности транзакций дает существенное преимущество: операции чтения и записи объектов данных никогда не конфликтуют. Но и цена отсутствия этих конфликтов достаточно высока. Накладные расходы складываются из следующих составляющих:

  • хранение версий объектов данных;
  • очистка устаревших версий объектов данных;
  • затраты по актуализации запрашиваемых данных на чтение;
  • принудительный откат транзакций в случае неактуальности считанных данных.
Кроме того, вводится ограничение на операции записи данных: для каждого объекта данных в каждый момент времени может существовать только одна нефиксированная версия. Порождение конкурирующей транзакцией второй нефиксированной версии запрещено. Это связано с тем, что разрешение порождать две нефиксированные версии объекта данных с последующей фиксацией соответствующих транзакций влечет проявление феномена LOST UPDATE. Разрешение порождения двух нефиксированных версий одного объекта данных влечет откат одной из конкурирующих транзакций, а именно той, которая подает операцию СOMMIT второй. Допускать фиксацию обеих транзакций нельзя, поскольку это привело бы систему к рассогласованию данных.

Если при использовании техники блокирования основным регулятором взаимодействия транзакций является синхронизационный захват объектов данных и запрет/разрешение доступа к данным, то при использовании техники многоверсионности основным регулятором является предоставление копии объекта данных и хранение копии объекта данных до тех пор, пока она может быть востребована хотя бы одной транзакцией.
Сравнивая цену, её надо реально сравнивать, а не выдавать желаемое за действительное...
1. Хранение версий устаревших данных есть и в блокировочных и в версионных СУБД. В блокировочных СУБД устаревшие данные хранятся в журнале.
2. Очистка устаревших версий, соответственно тоже необходима при обоих типах изолированности, при этом в версионном варианте неактуальные данные могут просто перезаписываться новыми записями, наравне с записями помеченными, как удалённые. То есть, никаких дополнительных расходов на очистку от устаревших версий версионность не требует.
3. Затраты на актуализацию при чтении у версионных серверов меньше, чем у блокировочных. Реально такая проверка сводится к тому, что сравниваются метки транзаций: метка у записи с меткой текущей транзакции. Блокировочный сервер должен при чтении проверить не заблокирована ли данная запись на изменение. Если не заблокирована, то установить для неё свою блокировку на чтение. Казалось бы это совсем немного работы... Но! Блокирующий механизм это один синхронизирующий поток/процесс для всех транзакций (и читающих, и пишущих). Распараллелить работу механизма блокировок очень непросто, а это означает, что каждая транзакция для каждой обрабатываемой записи встаёт в очередь к процессу/потоку, который отвечает за блокировки. При этом для каждой записи данные о блокировках: 1. Читаются, 2. Устанавливаются, 3. Снимаются. Так что же проще... сравнить две метки или отработать блокировки?..
4. Принудительный откат транзакций существует независимо от того, блокировочный или версионный механизм используются. Неактуальность данных может быть и в том и другом случае. Но откат на блокировщике требует восстановления всех изменённых записей из журнала, в то время, как версионный вариант обходится тем, что делает метку данной транзакции неактуальной, соответственно, все изменённые данные тоже утрачивают свою актуальность и могут быть перезаписаны и проигнорированы при backup.
Ещё более странной выглядит привязка к LOST UPDATE - эта проблема существует только для блокировочных СУБД. В версионных СУБД "потерянных обновлений" не может быть в принципе, поскольку под каждое обновление создаётся своя версия и никто "чужих" не зафиксированных обновлений не может "затереть". Да, промышленные СУБД не позволяют сегодня создавать более одной версии, но это никак не связано с проблемой LOST UPDATE.
Вот такие перлы от Козленко... не впервые... не любит она версионные СУБД :) может потому что СУБД ЛИНТЕР, разработчиком которой она является... блокировочная СУБД... отставшая от реалий.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: СУБД. Журнал транзакций.
« Ответ #11 : Апрель 15, 2012, 09:09:10 pm »
4. Принудительный откат транзакций существует независимо от того, блокировочный или версионный механизм используются. Неактуальность данных может быть и в том и другом случае. Но откат на блокировщике требует восстановления всех изменённых записей из журнала, в то время, как версионный вариант обходится тем, что делает метку данной транзакции неактуальной, соответственно, все изменённые данные тоже утрачивают свою актуальность и могут быть перезаписаны и проигнорированы при backup.

Хм... вроде она другое имела ввиду.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: СУБД. Журнал транзакций.
« Ответ #12 : Апрель 15, 2012, 09:41:21 pm »
Цитировать
Если две транзакции решат изменить один и тот же объект, то возникнет конфликт версий. Побеждает та транзакция, которая успела первой, а опоздавшую, как правило, приходится откатывать. С точки зрения производительности откат довольно-таки дорогая операция, к тому же приходится в обязательном порядке предусматривать обработку подобного конфликта. Если в чистом блокировочнике откат транзакции явное следствие ошибки, то в версионнике откат может произойти во вполне невинной ситуации.

http://www.rsdn.ru/article/db/yukonvers.xml

alexus

  • Гость
Re: СУБД. Журнал транзакций.
« Ответ #13 : Апрель 16, 2012, 03:01:31 am »
4. Принудительный откат транзакций существует независимо от того, блокировочный или версионный механизм используются. Неактуальность данных может быть и в том и другом случае. Но откат на блокировщике требует восстановления всех изменённых записей из журнала, в то время, как версионный вариант обходится тем, что делает метку данной транзакции неактуальной, соответственно, все изменённые данные тоже утрачивают свою актуальность и могут быть перезаписаны и проигнорированы при backup.

Хм... вроде она другое имела ввиду.
То, что она имела ввиду приведено в цитате, повторю:
Цитировать
принудительный откат транзакций в случае неактуальности считанных данных

alexus

  • Гость
Re: СУБД. Журнал транзакций.
« Ответ #14 : Апрель 16, 2012, 03:04:50 am »
Цитировать
Если две транзакции решат изменить один и тот же объект, то возникнет конфликт версий. Побеждает та транзакция, которая успела первой, а опоздавшую, как правило, приходится откатывать. С точки зрения производительности откат довольно-таки дорогая операция, к тому же приходится в обязательном порядке предусматривать обработку подобного конфликта. Если в чистом блокировочнике откат транзакции явное следствие ошибки, то в версионнике откат может произойти во вполне невинной ситуации.

http://www.rsdn.ru/article/db/yukonvers.xml
Если две транзакции решат изменить один и тот же объект, то в блокировочном сервере происходит "отлуп" с откатом второй транзакции, иначе и быть не может. Все последующие рассуждения автора - полная чушь. Какую "невинную ситуацию" имел ввиду автор... осталось загадкой.