Я пытаюсь понять Oracle 11g немного ближе. Мой вопрос прост: как Oracle обрабатывает две сессии, которые пытаются вставить записи в одну таблицу одновременно.
Например, INSERT A запускается в 13:00 против таблицы 1. Это займет 5 минут. Вставка B выполняется в 13:02 против Таблицы 1. Это займет 1 минуту, чтобы завершить.
Что случится? Будет ли очередь Oracle INSERT B выполняться после завершения INSERT A? Будет ли INSERT B работать одновременно с INSERT A?
Спасибо!
insert into foo(id) select level from dual connect by level<1000000
(увеличивая количество нулей по одному, пока оно не станет достаточно медленным),Ответы:
Вставки не влияют друг на друга, если они не будут конфликтовать с ограничениями уникального или первичного ключа. Они должны быть независимыми. Я полагаю, что эта проблема параллелизма является одной из причин, почему последовательность Oracle является отдельным объектом (кэшированное, суррогатное поколение PK отделено от вставки).
В этом отношении они работают с незафиксированным столом так, как это видно на их сеансе. Это поведение описано в сообщении stackoverflow ниже.
/programming/3194999/dml-by-multiple-users-commit-scenarios-in-oracle
источник
Возможно, будет полезно взглянуть на Oracle Transaction Management (концепции) или обработку SQL для разработчиков приложений (Расширенное руководство разработчика приложений)
Вы можете исследовать поведение оракула, открыв сеанс с sqlplus, установив автокоммит, выполнив
отключить автокоммит
и выполнение вставки
вставить в таблицу A (...) значения (...);
Оставьте этот сеанс открытым и запустите сеанс sqlplus из другого окна, отключите autocommit и выполните другую вставку. Обе транзакции будут активны, пока вы не закроете их с помощью коммита (или отката).
В большинстве случаев нет необходимости отключать автокоммит, потому что это значение по умолчанию для sqlplkus, если вы не изменили это.
источник