Oracle - Как работает транзакция, сегмент отката и параметр undo_retention?
Я не администратор баз данных, и мне трудно понять процесс управления транзакциями в Oracle.
Из того, что я понял, прочитав некоторые надежно выглядящие страницы в Интернете (особенно это примечание AskTom - но не беспокойтесь о комментариях), когда транзакция фиксируется, новые данные еще не передаются в фактический блок данных., но остается зарегистрированным в сегменте отката. Когда кто-то выдает SELECT для данных или по прошествии секунд UNDO_RETENTION - в зависимости от того, какое из этих двух событий произойдет первым - новые данные затем (и только потом) записываются в блоки данных.
Но кто-то в нашей компании, предположительно в курсе, недавно сказал мне обратное: по его словам, когда транзакция фиксируется, новые данные немедленно записываются в блоки данных, а табличное пространство сегмента отката / отмены сохраняет старые данные для продолжительность UNDO_RETENTION секунд. Эти старые данные остаются доступными в течение этого времени для доступа по запросам, запущенным в SCN до транзакции.
Итак, что же на самом деле происходит внутри Oracle, и можете ли вы предоставить ссылки для подтверждения своего ответа?
Мы используем Oracle 9.2.0.8.
Заранее спасибо.
3 ответа
Здесь много всего! Человек в вашей компании по сути прав, за исключением того, что изменения записываются в блок данных в памяти по мере их внесения даже до фиксации; и они записываются на диск полностью независимо от того, когда вы фиксируете (возможно, до, возможно, после, никогда как часть операции фиксации).
1) UNDO_RETENTION не имеет ничего общего с тем, когда ваши изменения записываются в блок данных, либо в памяти, либо на диске. UNDO_RETENTION контролирует, как долго сохраняются данные, необходимые для отмены вашего изменения, ПОСЛЕ того, как вы передадите изменение. Цель состоит в том, чтобы другие запросы или сериализуемые транзакции, запущенные до вашей фиксации, могли по-прежнему запрашивать эти данные. Ссылка: http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/undo.htm
2) Когда вы делаете обновление, блоки данных в памяти изменяются. Они могут быть записаны или не записаны на диск (я полагаю, даже до того, как вы их совершите) это делается фоновым процессом. Также информация повторов записывается в буфер журналов повторов. Отмена генерируется и сохраняется в сегменте отмены.
3) Когда вы фиксируете, Oracle проверяет, что ваша информация о восстановлении записана на диск, и помечает отмененные данные как зафиксированные. Но он не записывает измененные блоки данных в памяти на диск и не возвращает назад и не отмечает каждый блок как зафиксированный. Это сделано для того, чтобы сделать коммит как можно быстрее. Ссылка: http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/transact.htm
4) Блоки данных в памяти будут помечены как зафиксированные, либо когда они будут записаны на диск фоновым процессом, либо в следующий раз, когда они будут использованы (с помощью SELECT или любой другой операции). Это то, что обсуждается в записке AskTom. Это не о том, записаны ли ваши изменения данных в блок; речь идет о том, помечены ли они как зафиксированные в самом блоке.
Мое понимание (в основном) позже, эта ссылка содержит детали.
Блоки данных не должны быть записаны, просто обновлены в буфере, они могут быть или не быть записаны на диск. Перед тем как выполнить коммит, повтор должен быть записан на диск.
Я также голосую за вторую версию, основанную на
эта ссылка (это Oracle 10.2, но я думаю, что она также относится и к 9.2).
В нем говорится: "После того, как транзакция зафиксирована, данные отмены больше не нужны для отката или восстановления транзакции. Однако для согласованных целей чтения для длительных запросов может потребоваться эта старая информация отмены для создания более старых изображений блоков данных".
а также
"Когда включено автоматическое управление отменой, всегда существует текущий период хранения отмены, который представляет собой минимальное время, в течение которого Oracle Database пытается сохранить старую информацию отмены перед ее перезаписью".