Loading
Простая транзация базы данных Oracle
До сих пор в этой главе вы знакомились с компонентами системемы базы данных Oracle: необходимыми файлами и распределением памяти, а также способами их настройки. Теперь пришло время посмотреть, как Oracle обрабатывает пользовательские запросы и как проводит изменение в данных. Важно помнимать механизм обработки транзакций SQL, потому что все взаимодействие с базо данных Oracle происходит либо в форме запросов SQL, которые читают данные, либо операций SQL (или PL/SQL), которые модифицируют, втсаляют или удаляют данные.
Транзакция – это логическая единица работы в базе данных Oracle, состоящая из одного или более операторов SQL. Транзакция начинается с первого исполняемого опертартора SQL и завершается, когда вы фиксируетет или отказываете транзакцию. Фиксация (commiting) транзакции закрепляет проведенные вами изменения, а токат (roll back) – конечно же, отменяет их. Как только вы зафиксировали траназакцию, все прочие транзакции других пользователей, которые начались после нее, смогут видеть изменения, проведенные вашими транзакциями.
Когда транзакция вообще не может выполниться (сказем, из-за отключения электропитания), то она вся целиком должна быть отменена. Oracle откатывает все изменения, проведенные предшествующими операторами SQL, возвращая данные в исходное состояние (которое они имели перед началом транзакции). Весь процесс потроен так, чтобы поддерживать целостность данных – т.е. концепцию «все или ничего».
Следующий простой пример вставки строки описывает то, как Oracle обрабатывает транзакцию.
1) Пользователь запрашивает соединение с сервером Oracle через 3-уровневый или n-уровневый клиент, используя Oracle Net Services.
2) После проверки запроса сервер запускает новй выделенный серверный процесс для этого пользователя.
3) Пользователь выполняет опертаор для вставки новой строки в талбилу.
4) Oracle проверят привилегии пользователя, чтобы удостовериться, что он имеет необходимые права для выполенения вставки. Если информация о привилегиях пользователя еще отствует в библиотечном кэше, она будет прочитана с диска в этот кэш.
5) Если пользователь имеет необходимые привилегии, Oracle проверяет, не выполнялся ли подбный данному опертор SQL недавно, и не находится ли он в разделяемом пуле. Если да, Oracle выполняет эту версию оператоар SQL, а в противном случае разбирает и выполняет ноый пользовательски опертаор SQL. Затем Oracle создает частную облать SQL в PGA пользовательского сеанса.
6) Сначала Oracle проверяет, нет ли нужных данных в буферном кэше данных. Если нет, серверный процесс читает необходимую таблицу из файлов данных на диске.
7) Oracle немедленно применяет блокировки уровня строки где это необходимо, предотвращая попытки других процессо изменить те же данные параллельно.
8) Сервер пишет веторы изменений в буфер журнала повторного выполенения.
9) Сервер модифицирет табличные данные (вставляет новыю строку) в буферный кэш данных.
10) Пользователь фиксирует транзакцию, закрепляя вставку. Oracle снимает блокировки строки полсе окончания фиксации.
11) Процесс-писатель журнала неменделнно записывает измененные данные из буферов журналов повторного выполенения вонлайновый файл журнала.
12) Серверный процесс посылает сообщение клиентскому процессу, сигнализируя об успешном завершении операции INSERT. В данном случае сообщение будет содержать «COMMIT COMPLETE». (Если он не сможет завершить запрос успешно, то пошел сообщение, указывающее на сбой операции).
13) Изменения, проведенные в таблице посредством вставки, могут быть не сразу записаны на диск. Процесс-писатель базы даных производит запись пакетами, так что может пройти некоторое время, прежде чем вставленная информация действительно попадет в файл данных на диске.
Фиксация и откат
Вы должны четно поинмать длва фундаментальных термина, касающихся транзакций: фиксаций (comminting) и откат (rolling back) транзакций. Ниже кратко объясняются оба термина.
Фиксация транзакции
Когда вы фиксируете транзакцию, чкажем, посредством оператора COMMIT, Oracle делает все имзееения, выполненные всеми операторами SQL, в рамках этой транзакции, постоянной частью базы данных. Прежде, чем Oracle зафиксирует результаты транзакции, он делает следующее.
-
Генерирует информацию отмены (undo), которая состоит из значений данных, подлежащих модификации, до изменений. Эти данные сохранятся в сегменте undo, расположенном в табличном пространстве undo.
-
Он также генерирует данные повторного выполенения (redo), содержащие изменения в блоках данныхи и в блоках отката, в буфер журнала повторного выполенения. База данных может писать на диск содержимое буферов журнала повторного выполенения перед фиксацией транзакций.
-
Проводит изменения в буферах базы данных, находящихся в SGA. База данных может писать модифицированные буферы на диск перед фиксацией транзакции.
База данных может писать изменения транзакции, которые были выполнены первыми, из буферов базы данных в SGA в файлы данных немедленно или же спестя какое-то время после фиксации трназкции, либо даже перед ее фиксацией. Когда баз данных фиксирует транзакцию, она выполняет следуюшее.
-
База данны назначает и запсывает SCN для фиксируемой траназакции.
-
Писатель журналов пишет элементы журнала повторного выполенения в файл журнала повторного выполненеия на диске из буфера журнала повторного выполнения в SGA: он также записывает SCN транзакции в файл журнала повторного выполенения, помечая тем официальную фиксацию транзакции.
-
База данных освобождает все блоокировки таблиц и строк.
-
База данных помечает транзакцию как завершенную.
Откат транзакции
Отменить изменения, выполненные транзакцей, которые еще не были зафиксированы можно с помощью команды ROLLBACK. В то время как журнал повторного выполекнения содержит все изменения, проведенные в транзакции, сегмент отмены (undo) содержит все старые значения, которые существовали до момента проведения изменений. Вы можете либо откатиь изменения, проведенные всей транзакцией, либо просто вернуться к маркеру, который посместили ранее внутри транзакции, называемому точнкой сохранения (savepoint). Существует несколько типов отката, среди которых перечилены ниже:
-
Откат , запрошенный пользователем.
-
Откат, произошедший из-за ненормального прерывания работы процесса или экземпляра.
-
Откат незафиксированных транзакций во время восстановления.
-
Откат уровня оператора, произошедший из-за ошибки выполенения этого оператора.
Независимо от причины отката, процедура всегда одна и та же.
-
База данных использует данные в виде, котоырй они имели до изменения в табличном пространстве undo, чтобы отменить все изменения, проведенные во время транзакции.
-
База данных освободжает все блокировки транзакции и таблицы.
-
База данных завершает транзакцию
Целостность данных и параллелизм данных
База данных была бы не слишком полезной, если бы имножество пользователей не могли обращаться к данным и модифицировать их одновременно. Под праллелизом данных (a concurrency) понимают спободность базыд анных обеспечивать параллельный достп для множествапользователей. Чтобы обеспечить согласованные результаты, база данных нуждается в механизме, который гарантирует, что пользовательи не будут натыкаться на зименения, проводимые дляг другом. Целостность данных (data consistence) - это возможность для пользователя получать согласованное представление данных, включая все изменения, проведенные в них другими пользователями.
Для обеспечения целостности данных, Oracle использует специальные структуры, именуемые сегментами отмены (undo segments). Например, когда вы читаете набор данных для транзакции, Oracle обеспечивает, чтобы прочитанные данные были согласованы по набору тразакций т.е. гарантирует, что данные, которые вы видите, отражают один набор зафиксированных транзакций. Oracle также обеспечивает согласованность данных по чтению, что означает, что все данные, выбранные вашими запросами, относятся к одному моменту времени. Сегменты отмены Oracle – это часть табличного пространства undo, упомянутого ранее в этой главе.
Oracle использует механизм блокировок для обеспечения параллелизма данных. Позволяя одному пользователю блокировать индивидуальные строки или целые талбицы, он гарантирует ему исплючительное использование таблицы в целях обновления. Важной характеристикой механизмов блокировки Oracle явялется то, что они по большей части происходят автоматически. Вам не нужно беспокоиться о деталях блокировки объектов, которые вы хотите модифицировать – Oracle «за кулисами» позаботится об этом.
Oracle использует две базоваые модели блокировок. Модель исключельной блокировки применяется для обновлений, а модель разделяемой блокировки используется для операции SELCT на таблицах. Модель разделяемой блокировки позволяет нескольким пользователям одновременно читать один и те же строки таблицы. Модель исключительной блокировки, поскольку влючает обновление таблицы, может использоваться только одним пользователем в любой заданный момент времени. Исключиельнаые блокировки почти всегда применяются к определенным строкам, подлежащим обновлению, позволяя одновременно использовать базы данных множеству пользователей. После выполеннеия команды COMMIT или ROLLBACK Oracle автоматически освобождает блокировки на тиблицах и прочие важные ресурсы.
Блокировки Oracle сложны, и вы детально познакомитесь с ними в главе 8, вместе с тем, как Oracle обеспечивает согласованность и параллелизм данных.
Писатель базы данных и протокол опережающей записи
Писатель базы данных, как вы видели ранее, отвечает за запись в файлы данных всех модифицированных буферов из буферного кэша базы данных. Кроме того, он следут за наличием свободного пространства в буферном кэше, чтобы серверный процесс мог читать новые данные из файлов данных при необходимости. Протокол опережающей заприси (журнала) также требует, чтобы записи повторного выполенения в буфере журнала поторного выполенения, ассоциированные с измененной информацией в буферном кэше, были записаны в буфер журнала повторного выопленени перед тем, как они отразаятся в файлах данных. Важность содержимого журнала повторного выполнения диктует Oracle обязательность записи содержимого файла журнала повторного выполенения в постоянное хранилище перед тем, как изменения данных будут проуедены в фалах данных на диске.
Когда пользователь фиксирует транзакцию, процесс-писатель журнала немедленно вносит в файлы журналов повторного выполенения запись о фиксации. Полный набор записей, затронутых зафиксированной транзакцией, может и не записываться одновременно в вфайлы данных. Механиз быстрой фиксайыии, наряду с журнеалом опережающей записи, гарантирует, что базада нных не будет ждать завршения всех физических операций записи после каждой транзакции. Как вы можете себе представить, огронмые базы данных OLTP с многочисленными изменениями на протяжении всего дня не могли бы функционировать оптимально, если бы им пришлось выполнять запись на диск после каждого зафиксированного изменения данных.
При наличии огромного числа тарназкций и, как следствие, огромного количесва запросов на фиксацию, процесс-писатель журнала может и не вносить немедленно запись о каждой зафиксированной транзакции в журнал повтрного выполенения. Он таожет накапливать по нескольку запросов на фиксацию, если очень занят в данный момет. Такая паккетированная запись информации о множестве зафиксированных транзакций называется групповой фиксацией.
Системный номер изменения
Системный номер изменения, или SCN (system change number) – важный оцночный фактор, используемый базой данных Oracle для отслеживаения состояния в каждый данный момент времени. Когда вы читаете (SELECT) данные в таблицах, то не затрагиваете состояния базы данных, но когда модифици руеете, свляете или удаляете строку, то состояние базы данных по отношению к тому, каким оно было доперации. Oracle использует SCN для слежения за всеми изменениями, проведенными в базе данных со временем. SCN – это логическая временная метка, используемая Oracle для упорядочивания событий, присходящих с базой данных. SCN очень важен по нескольким причинам, не последняя из которых – восстановление базы данных после сбоя.
SCN подобны возрастающим номерам последовательности, и Oracle сначала увеличивает их в SGA. Когда транзакция модифицирует или вставляет данные, Oracle сначала пишет новый SCN в сегмент отката. Процесс-писатель журналов затем немедленно вносит запись о фиксации транзакции в жрунал повторного выполенения, и эта запись получает уникальный SCN в сегмент отката. Процесс-писатель журнало затем немедленно вносит запись офиксации транзакции в журнал повторного выполенения, и эта запись получает уникальный SCN новой транзакции. Фактически запись этого SCN в журнал поторного выполенения отмечает зафиксированную транзакцию в базе данных Oracle.
SCN помогает Oracle оперделять необходимость восстановления после сбоя, после внезапного прерывания работы экземпляра базы данных или просле издания команды SHUTDONW ABORT. Всякий раз, когда база данных выполняет операцию котрольного точки, Oracle пишет команду STAR SCN в заголовки файлов данных. Управляющий файл поддерживает значение SCN для каждого файла данных, называемоый STOP SCN, который обычно устанавливается в бесконечность, и всякий раз, когда экземпляр останавливается нормально (командой SHUTDOWN NORMAL или SHUTDOWN IMMEDIATE). Oracle копирует номер START SCN в заголовках файлов данных в номера STOP SCN ля файлов данных в управляющем файле. Когда вы перезпускаете базу данных после успешного останова, нет необходимости ни в каком восстановлении, потому что номера SCN в файлах данных и упрвляющих файлах соответствуют. С другой стороны, внезапное прерывание работы экземпляра не оставляет времени на приведение в соответствие номеров SCN, и Oracle обнаруживает необходимость восстановления экземпляра, потому что отличаются номера SCN в файлах данных с одной стороны, и управляющем файле - с другой. Они играют ключевую роль в восстановлении базы данных. Oracle определяет, на сколько нужно вренться, применяя архивные журналы повторного выполенения во время восстановления на основе SCN.
Управление отменой
Когда вы проводите изменения в базе данных, вы должны иметь возможность отменить или откатить это изменение при необходимости. Информация, необходимая для отмены или отката изменений транзакции, которая в основном состит из информации таблицы, предшествующей изменению, называется данными отмены (веторами изменений) и хрантися в записях отмены (undo records). При выдаче команды ROLLBACK Oracle использует эти записи отмены для замены измененных данных их исходными версиями. Записи отмены жизеннно важны для восстановления базы данных, когда незавршенные или незафиксированные транзакции должны бытьотменнеы, чтобы отавит базу в согласованном состоянии.
Oracle настоятельно рекомендует использовать средство автоматического упрвления изменениями (Automatic Undo Management - AUM), при котором сам сервер oracle будет поддерживать и управлять сегментами отмены (отката). Все, что вам нужно сделать – это прдоставить выделенное табличное пространствао undo и установить параметр инициализации UNDO_MANAGEMENT в auto. Oracle создаст необхоимое количество сегментов отмены, которые структурно подобны традиционным сегментам отката, и будет расширять их по мере необходимости. Нет ничего необычного в том, что будут созваться новые сегменты отмен, а старые – деативизироваться в зависимости от количества транзакцй, проводимых в базе данных.
Поскольку Oracle самостоянеольно управляет размерами индивидуальных сегментов отмены, два решения, которые вы должны принять, касаются размера табличного прострнства undo и установки инициализационного параметра UNDO_RETINTION (который определяет, насколько долго Oracle бует стараться хранить для вас записио об отмене втабличном пространстве undo). Помните, что ваше талбличное пространство undo дожно не только вместить все долговременные транзакции, но так же быть достаточно большим, чтобы позволить работаь всем средства ретроспективы (flashback), которые вы можете реализовать в вашей базе данных; средства ретроспекивы Oracle повзоляют отменять изменение данных на различных уровнях. Некоторые из них, такие как Flashback Query, Flashback Versions Query и Flashback Table используют данные отмены.
Вы можете использовать Undo Advisor Oracle через OEM для нахднения иделаьного размер табличных пространств undo и идеальной длительности, чтобы специфицировать параметр UNDO_RETENTION. Посредством статистики текущего использования пространства отмены можно оценить оптимальные параметры генерации данных отмены для вашего экземпляра.