Oracle для профессионалов



Многоверсионность


Эта тема очень тесно связана с управлением одновременным доступом, поскольку создает основу для механизмов управления одновременным доступом в СУБД Oracle — Oracle использует модель многовариантной согласованности по чтению при одновременном доступе. В главе 3 мы более детально рассмотрим технические аспекты многоверсионности, но по сути это механизм, с помощью которого СУБД Oracle обеспечивает:

  • согласованность по чтению для запросов: запросы выдают согласованные результаты на момент начала их выполнения;
  • неблокируемые запросы: запросы не блокируются сеансами, в которых изменяются данные, как это бывает в других СУБД.
  • Это две очень важные концепции СУБД Oracle. Термин многоверсионность

    произошел от того, что фактически СУБД Oracle может одновременно поддерживать множество версий данных в базе данных. Понимая сущность многоверсионности, всегда можно понять результаты, получаемые из базы данных. Наиболее простой из известных мне способов продемонстрировать многоверсионность в Oracle:

    tkyte@TKYTE816> create table t 2 as 3 select * from all_users;

    Table created.

    tkyte@TKYTE816> variable x refcursor

    tkyte@TKYTE816> begin 2 open :x for select * from t; 3 end; 4 /

    PL/SQL procedure successfully completed.

    tkyte@TKYTE816> delete from t;

    18 rows deleted.

    tkyte@TKYTE816> commit;

    Commit complete.

    tkyte@TKYTE816> print x

    USERNAME USER_ID CREATED ------------------------------ ---------- --------- SYS 0 04-NOV-00 SYSTEM 5 04-NOV-00 DBSNMP 16 04-NOV-00 AURORA$ORB$UNAUTHENTICATED 24 04-NOV-00 ORDSYS 25 04-NOV-00 ORDPLUGINS 26 04-NOV-00 MDSYS 27 04-NOV-00 CTXSYS 30 04-NOV-00 ... DEMO 57 07-FEB-01

    18 rows selected.

    В этом примере мы создали тестовую таблицу T и заполнили ее данными из представления ALL_USERS. Мы открыли курсор для этой таблицы. Мы не выбирали данные с помощью этого курсора, просто открыли его.

    Помните, что при открытии курсора сервер Oracle не "отвечает" на запрос; он никуда не копирует данные при открытии курсора (представьте, сколько времени потребовало бы открытие курсора для таблицы с миллиардом строк в противном случае). Курсор просто открывается и дает результаты запроса по ходу обращения к данным. Другими словами, он будет читать данные из таблицы при извлечении их через курсор.




    Содержание  Назад  Вперед