«Оператор» в этом контексте - это один оператор 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 работают с версией базы данных, существовавшей на один момент времени. Этот момент времени почти всегда является временем начала заявления. Существуют некоторые исключительные случаи, связанные с обновлениями, когда этот момент времени будет перемещен в момент времени «промежуточный оператор». Но это всегда согласованно на тот или иной момент времени.