Сергей Маркеленков,
компания РДТЕХ
http://www.rdtex.ru,
markenekov@rdtex.ru

Алгоритм “мини-откатов” в Oracle или
еще раз о Write Consistency


[От редакции OMRE: Уважаемые читатели,
первая часть этой статьи была опубликована в предыдущем выпуске нашего журнала с некоторыми погрешностями по оформлению и внутренным ссылкам в тексте. Приносим свои извинения.
Поэтому в связи с существенными трудностями по надлежащему форматированию и оформлению статьи, снижение требований к которым может повлять на замысел автора и снизить информационную ценность и доступность изложенного в ней материала, мы, прекращая публикацию ее HTML-текста, размещаем на сайте по ссылке Write Consistency.zip ее зазипованный авторский текст в формате MSWord.
По нашей просьбе Сергей Маркеленков любезно согласился написать "Краткую сводку предпосылок и результатов" исследований, которые он предпринял и описал в своей статье.
]


Полное оглавление статьи

  • Что такое “мини-откат”?
  • Как будет проводиться тестирование
  • Тест 1 (с минимально достаточным объемом трассировочной информации)
  • Листинг 1
  • Листинг 2
  • Листинг 3
  • Листинг 4
  • Листинг 5
  • Листинг 6
  • Тест 2 (с выдачей подробной трассировочной информации)
  • Листинг 7
  • Тест 3. Один из случаев “мини-отката” команды MERGE
  • Листинг 8
  • Описание условий возникновения и алгоритма “мини-откатов”
    1. 1. Алгоритм “мини-откатов” при выполнении команд update и delete
    2. 2. Алгоритм “мини-откатов” при выполнении команды merge
    3. 3. Алгоритм “мини-откатов” при выполнении команды select for update
  • Как обнаружить “мини-откаты”?
  • Листинг 9
  • Рекомендации по уменьшению негативного влияния “мини-откатов”
    1. 1. Помните о влиянии “мини-откатов” на логику приложения
    2. 2. Влияние “мини-откатов” на производительность. Способы уменьшения этого влияния
  • Что есть по поводу “мини-откатов” в документации
  • Список литературы

Краткая сводка предпосылок и результатов

В очередной раз зайдя на сайт Тома Кайта, я обнаружил ссылку на дискуссию, посвященную так называемым “мини-откатам”. Так я буду называть принятый в Oracle алгоритм разрешения конфликтной ситуации, при которой DML-команда обнаруживает в изменяемой ею таблице строку, которая на момент начала этой команды удовлетворяла условию во фразе WHERE, а на момент изменения – уже не удовлетворяет. То есть, какая-то транзакция другого сеанса уже успела изменить строку и зафиксировать это изменение раньше, чем до этой строки, пытаясь изменить ее, добралась наша DML-команда. В такой ситуации выполняется приблизительно следующий алгоритм разрешения конфликта:

  • производится откат всех изменений, сделанных ранее DML-командой;
  • выполняется попытка (возможно неоднократная) блокировки всех изменяемых строк таблицы;
  • в случае успешной блокировки строк производится их изменение.

В упомянутой выше дискуссии рассматриваются не все DML-команды и не все условия, способные привести к “мини-откату” команды. Я же постарался изучить все такие команды, а также рассмотреть все возможные условия, которые влияют или могут повлиять на алгоритм “мини-откатов”. В своих исследованиях я использовал некоторые недокументированные возможности Oracle. В статье показан способ их применения для обнаружения “мини-откатов”.

В связи с тем, что “мини-откаты” оказывают негативное влияние на производительность, даны рекомендации по уменьшению вероятности их появления и уменьшению накладных расходов, с ними связанных. Показано несколько альтернативных способов обнаружения “мини-откатов” с различной степенью сложности и достоверности.

Кроме влияния на производительность, “мини-откаты” могут оказать влияние на логику приложений, что в том числе выражается в зачастую непредсказуемом числе срабатываний строчных и операторных BEFORE-триггеров, имеющихся у таблицы. В своей статье я постарался перечислить все связанные с “мини-откатами” “подводные камни”.

Разумеется, при написании статьи я производил поиск соответствующей информации в документации, на Oracle Metalink и других интернет-сайтах. В конце статьи приведены цитаты и ссылки, в которых есть хоть какое-то описание или упоминание об алгоритме “мини-откатов”.

Учитывая то, что как сам алгоритм “мини-откатов”, так и даже сам факт его наличия в коде Oracle практически не отражен в документации, надеюсь, что для многих специалистов, работающих с СУБД Oracle, данная статья откроет новые, ранее неизвестные подробности.

Несмотря на то, что данная статья посвящена в первую очередь администраторам баз данных Oracle, я надеюсь, что затрагиваемая в ней тема будет интересна и полезна и разработчикам приложений. А если учесть влияние “мини-откатов” на логику приложений, то, на мой взгляд, разработчики просто обязаны знать о “мини-откатах” и учитывать их при разработке приложений.


[Еще раз напоминаем, что полный зазипованный текст статьи можно скачать по ссылке Write Consistency.zip.]
E-mail this page