Действительно ли БД Oracle изолирована во время выполнения команды COMMIT? - PullRequest
0 голосов
/ 11 октября 2019

Рассмотрим эти две транзакции:

INSERT INTO foo VALUES (1, 2, 'bar');
INSERT INTO foo VALUES (1, 4, 'xyz');
COMMIT;

и

SELECT * FROM foo;

Есть ли момент времени, когда SELECT будет видеть только одну строку, вставленную из первой транзакции?

До сих пор я не смог найти никаких доказательств того, что данные видны только после успешного завершения COMMIT. Когда Oracle записывает журнал Redo во время коммита, он записывает его последовательно, я прав? Таким образом, есть точка, в которой написана первая строка, но не вторая. И поскольку авторы не блокируют читателей в Oracle, если выбор попадает именно в это окно, он видит только одну строку. Или есть какой-то другой механизм блокировки?

Ответы [ 2 ]

4 голосов
/ 11 октября 2019

Нет. Данные не будут существовать, пока фиксация не будет успешной.

см. ATOMICITY

Конечно, в том же сеансе вы можете видеть незафиксированные данные, например:

INSERT INTO foo VALUES (1, 2, 'bar');
SELECT * FROM foo;
INSERT INTO foo VALUES (1, 4, 'xyz');
COMMIT;

Функция выбора покажет вставленные данные, даже если фиксация еще не выполнена.

2 голосов
/ 11 октября 2019

Неа. Невозможно увидеть только один ряд.

У меня нет точных подробностей реализации, но основная идея заключается в том, что с каждой записью связан последний измененный номер транзакции. Когда другая транзакция считывает данные, она проверяет состояние последней измененной записи транзакции (и собственный уровень изоляции) и выбирает только разрешенные записи. (Это довольно распространено для любых баз данных MVCC)

Более того, даже когда выборка транзакции имеет уровень изоляции RC, каждый запрос перед выполнением делает снимок текущих активных состояний транзакции и использует его для выполнения проверки выше. Фактически это означает, что каждый запрос выполняется на уровне изоляции SNAPSHOT. (Это особенность оракула)

Подробнее здесь: https://docs.oracle.com/cd/E25054_01/server.1111/e25789/consist.htm

Проверьте части согласования чтения многоверсии и уровня оператора.

...