Как Oracle обрабатывает несколько одновременных вставок в одну таблицу

8

Я пытаюсь понять Oracle 11g немного ближе. Мой вопрос прост: как Oracle обрабатывает две сессии, которые пытаются вставить записи в одну таблицу одновременно.

Например, INSERT A запускается в 13:00 против таблицы 1. Это займет 5 минут. Вставка B выполняется в 13:02 против Таблицы 1. Это займет 1 минуту, чтобы завершить.

Что случится? Будет ли очередь Oracle INSERT B выполняться после завершения INSERT A? Будет ли INSERT B работать одновременно с INSERT A?

Спасибо!

Dustin
источник
6
ничто не сравнится с попыткой увидеть себя :-)
Джек говорит, попробуй topanswers.xyz
Абсолютно. Однако я не уверен, как создать запрос, который намеренно займет 5 минут.
Дастин
3
вставить много данных? insert into foo(id) select level from dual connect by level<1000000(увеличивая количество нулей по одному, пока оно не станет достаточно медленным),
говорит Джек, попробуйте topanswers.xyz

Ответы:

4

Вставки не влияют друг на друга, если они не будут конфликтовать с ограничениями уникального или первичного ключа. Они должны быть независимыми. Я полагаю, что эта проблема параллелизма является одной из причин, почему последовательность Oracle является отдельным объектом (кэшированное, суррогатное поколение PK отделено от вставки).

В этом отношении они работают с незафиксированным столом так, как это видно на их сеансе. Это поведение описано в сообщении stackoverflow ниже.

/programming/3194999/dml-by-multiple-users-commit-scenarios-in-oracle

REW
источник
2

Возможно, будет полезно взглянуть на Oracle Transaction Management (концепции) или обработку SQL для разработчиков приложений (Расширенное руководство разработчика приложений)

Вы можете исследовать поведение оракула, открыв сеанс с sqlplus, установив автокоммит, выполнив

отключить автокоммит

и выполнение вставки

вставить в таблицу A (...) значения (...);

Оставьте этот сеанс открытым и запустите сеанс sqlplus из другого окна, отключите autocommit и выполните другую вставку. Обе транзакции будут активны, пока вы не закроете их с помощью коммита (или отката).

В большинстве случаев нет необходимости отключать автокоммит, потому что это значение по умолчанию для sqlplkus, если вы не изменили это.

miracle173
источник