Como o Oracle lida com vários INSERTs simultâneos em uma tabela


8

Estou tentando entender o Oracle 11g um pouco mais de perto. Minha pergunta é simples: como o Oracle lida com duas sessões que estão tentando inserir registros em uma única tabela ao mesmo tempo.

Por exemplo, INSERT A é executado às 13:00 contra a Tabela 1. Demorará 5 minutos para ser concluído. INSERT B é executado às 13h02 contra a Tabela 1. Demorará 1 minuto para concluir.

O que vai acontecer? O Oracle enfileirará o INSERT B para ser executado após a conclusão do INSERT A? O INSERT B será executado simultaneamente com o INSERT A?

Obrigado!


6
nada bate a tentar it yourself para ver :-)
Jack diz tentar topanswers.xyz

Absolutamente. No entanto, não sei como criar uma consulta que levará intencionalmente 5 minutos para ser concluída.
Dustin

3
inserir muitos dados? insert into foo(id) select level from dual connect by level<1000000(aumentando o número de zeros um de cada vez até que seja suficiente lenta)
Jack diz tentar topanswers.xyz

Respostas:


4

As inserções não se afetam, a menos que entrem em conflito com restrições de chave primárias ou únicas. Eles devem ser independentes. Acredito que esse problema de simultaneidade seja um dos motivos pelos quais a sequência do Oracle é um objeto separado (geração PK em cache e substituta separada da inserção).

A esse respeito, eles operam na tabela não confirmada, como é visto em sua sessão. Esse comportamento é descrito na postagem do stackoverflow abaixo.

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


2

Talvez seja útil dar uma olhada no Oracle Transaction Management (Concepts) ou no SQL Processing for Application Developers (Guia avançado do desenvolvedor de aplicativos)

Você pode investigar o comportamento do oracle abrindo uma sessão com sqlplus, configurando a confirmação automática executando

desativar o comprometimento automático

e executando uma inserção

inserir na tabelaA (...) valores (...);

Deixe essa sessão aberta e inicie uma sessão do sqlplus a partir de outra janela, defina a confirmação automática como desativada e emita outra inserção. Ambas as transações estarão ativas até você fechá-las com confirmação (ou reversão).

Na maioria das situações, não é realmente necessário desativar a confirmação automática, porque esse é o padrão para o sqlplkus se você não tiver alterado isso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.