Некоторая путаница в описании последовательности чтения в Oracle - PullRequest
0 голосов
/ 03 июля 2018

Ниже приведено краткое описание согласованности чтения из руководства по концепциям оракула. ​​

Что такое оператор SQL, только один SQL? Или Pl / SQL или процедура хранения? Кто-нибудь может помочь предоставить мне один противоположный пример, который может указывать на непоследовательность прочитанного?

 read consistency 
    A consistent view of data seen by a user. For example, in statement-level read
    consistency the set of data seen by a SQL statement remains constant throughout
    statement execution.

1 Ответ

0 голосов
/ 03 июля 2018

«Оператор» в этом контексте - это один оператор DML: один SELECT, INSERT, UPDATE, DELETE, MERGE.

Это , а не блок PL / SQL. Аналогично, несколько исполнений одного и того же оператора DML (скажем, в цикле PL / SQL) являются отдельными «операторами». Если вам нужна согласованность по нескольким операторам или внутри блока PL / SQL, вы можете добиться этого, используя SET TRANSACTION ISOLATION LEVEL SERIALIZABLE или SET TRANSACTION READ ONLY. Оба вводят ограничения.

Противоположный пример несогласованного чтения будет следующим:

Начальные условия: таблица BIG_TABLE содержит 10 миллионов строк.

Пользователь А в 10:00:

SELECT COUNT(*) FROM BIG_TABLE;

Пользователь B в 10: 01:

DELETE FROM BIG_TABLE WHERE ID >= 9000000;  -- delete the last million rows

Пользователь Б в 10:02:

COMMIT;

Пользователь A в 10:03: запрос завершен:

COUNT(*)
--------------
9309129

Это неправильно. Пользователь А должен был получить 10 миллионов строк или 9 миллионов строк. Ни в коем случае в таблице не было 9309129 зафиксированных строк. Произошло то, что пользователь A прочитал 309 129 строк, которые пользователь B удалял до того, как Oracle действительно обработал удаление (или до COMMIT). Затем, после удаления / фиксации пользователем B, запрос пользователя A перестал видеть удаленные строки и прекратил их подсчет.

Подобные проблемы невозможны в Oracle благодаря реализации Multiversion Read Consistency.

В Oracle в описанной выше ситуации, когда он столкнулся с блоками, у которых строки были удалены (и зафиксированы) пользователем B, запрос пользователя A использовал бы данные UNDO для восстановления того, как эти блоки выглядели в 10:00 - время когда начался запрос пользователя А.

Вот и все - операторы Oracle работают с версией базы данных, существовавшей на один момент времени. Этот момент времени почти всегда является временем начала заявления. Существуют некоторые исключительные случаи, связанные с обновлениями, когда этот момент времени будет перемещен в момент времени «промежуточный оператор». Но это всегда согласованно на тот или иной момент времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...