Próbuję trochę lepiej zrozumieć Oracle 11g. Moje pytanie jest proste: w jaki sposób Oracle obsługuje dwie sesje, które próbują jednocześnie wstawić rekordy do jednej tabeli.
Na przykład WSTAW A działa o godzinie 13:00 w stosunku do tabeli 1. Wykonanie zajmie 5 minut. WSTAW B jest wykonywany o 13:02 w stosunku do tabeli 1. Wykonanie zajmie 1 minutę.
Co się stanie? Czy kolejka Oracle INSERT B zostanie wykonana po zakończeniu INSERT A? Czy INSERT B będzie działał jednocześnie z INSERT A?
Dzięki!
insert into foo(id) select level from dual connect by level<1000000
(zwiększanie liczby zer po kolei, aż będzie wystarczająco wolne)Odpowiedzi:
Wstawki nie wpływają na siebie nawzajem, chyba że byłyby w konflikcie z ograniczeniami klucza unikalnego lub podstawowego. Powinny być niezależne. Uważam, że ten problem współbieżności jest jednym z powodów, dla których sekwencja Oracle jest osobnym obiektem (buforowane, zastępcze generowanie PK oddzielone od wstawki).
Pod tym względem działają na nieprzydzielonym stole, jak widać na ich sesji. To zachowanie jest opisane w poście dotyczącym przepływu stosu poniżej.
/programming/3194999/dml-by-multiple-users-commit-scenarios-in-oracle
źródło
Być może warto rzucić okiem na Oracle Transaction Management (Concepts) lub SQL Processing for Application Developers (Advanced Application Developer's Guide)
Możesz zbadać zachowanie Oracle, otwierając sesję z sqlplus, ustawiając automatyczne zatwierdzanie przez wykonanie
wyłącz automatyczne zatwierdzanie
i wykonanie wstawki
wstaw do tabeli A (...) wartości (...);
Pozostaw tę sesję otwartą i rozpocznij sesję sqlplus z innego okna, wyłącz autocommit i wydaj kolejną wstawkę. Obie transakcje będą aktywne do momentu zamknięcia ich przez zatwierdzenie (lub wycofanie).
W większości sytuacji tak naprawdę nie jest konieczne wyłączanie automatycznego zatwierdzania, ponieważ jest to ustawienie domyślne dla sqlplkus, jeśli nie zostało to zmienione.
źródło