|
Сергей Маркеленков, компания РДТЕХ
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. Алгоритм “мини-откатов” при выполнении команд update и delete
- 2. Алгоритм “мини-откатов” при выполнении команды merge
- 3. Алгоритм “мини-откатов” при выполнении команды select for update
- Как обнаружить “мини-откаты”?
- Листинг 9
- Рекомендации по уменьшению негативного влияния “мини-откатов”
- 1. Помните о влиянии “мини-откатов” на логику приложения
- 2. Влияние “мини-откатов” на производительность. Способы уменьшения этого влияния
- Что есть по поводу “мини-откатов” в документации
- Список литературы
Краткая сводка предпосылок и результатов
В очередной раз зайдя на сайт Тома Кайта, я обнаружил ссылку на дискуссию, посвященную так называемым “мини-откатам”. Так я буду называть принятый в Oracle алгоритм разрешения конфликтной ситуации, при которой DML-команда обнаруживает в изменяемой ею таблице строку, которая на момент начала этой команды удовлетворяла условию во фразе WHERE, а на момент изменения – уже не удовлетворяет. То есть, какая-то транзакция другого сеанса уже успела изменить строку и зафиксировать это изменение раньше, чем до этой строки, пытаясь изменить ее, добралась наша DML-команда. В такой ситуации выполняется приблизительно следующий алгоритм разрешения конфликта:
- производится откат всех изменений, сделанных ранее DML-командой;
- выполняется попытка (возможно неоднократная) блокировки всех изменяемых строк таблицы;
- в случае успешной блокировки строк производится их изменение.
В упомянутой выше дискуссии рассматриваются не все DML-команды и не все условия, способные привести к “мини-откату” команды. Я же постарался изучить все такие команды, а также рассмотреть все возможные условия, которые влияют или могут повлиять на алгоритм “мини-откатов”. В своих исследованиях я использовал некоторые недокументированные возможности Oracle. В статье показан способ их применения для обнаружения “мини-откатов”.
В связи с тем, что “мини-откаты” оказывают негативное влияние на производительность, даны рекомендации по уменьшению вероятности их появления и уменьшению накладных расходов, с ними связанных. Показано несколько альтернативных способов обнаружения “мини-откатов” с различной степенью сложности и достоверности.
Кроме влияния на производительность, “мини-откаты” могут оказать влияние на логику приложений, что в том числе выражается в зачастую непредсказуемом числе срабатываний строчных и операторных BEFORE-триггеров, имеющихся у таблицы. В своей статье я постарался перечислить все связанные с “мини-откатами” “подводные камни”.
Разумеется, при написании статьи я производил поиск соответствующей информации в документации, на Oracle Metalink и других интернет-сайтах. В конце статьи приведены цитаты и ссылки, в которых есть хоть какое-то описание или упоминание об алгоритме “мини-откатов”.
Учитывая то, что как сам алгоритм “мини-откатов”, так и даже сам факт его наличия в коде Oracle практически не отражен в документации, надеюсь, что для многих специалистов, работающих с СУБД Oracle, данная статья откроет новые, ранее неизвестные подробности.
Несмотря на то, что данная статья посвящена в первую очередь администраторам баз данных Oracle, я надеюсь, что затрагиваемая в ней тема будет интересна и полезна и разработчикам приложений. А если учесть влияние “мини-откатов” на логику приложений, то, на мой взгляд, разработчики просто обязаны знать о “мини-откатах” и учитывать их при разработке приложений.
[Еще раз напоминаем, что полный зазипованный текст статьи можно скачать по ссылке
Write Consistency.zip.]
|