AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 11010
Accepted
Franz Kafka
Franz Kafka
Asked: 2012-01-20 14:09:15 +0800 CST2012-01-20 14:09:15 +0800 CST 2012-01-20 14:09:15 +0800 CST

Oracle 11g caçando o impasse, talvez chave estrangeira?

  • 772

Estou tentando entender porque ocorre um impasse no meu banco de dados. O rastreamento me diz que duas atualizações na mesma tabela estão bloqueando. In table é a primeira tabela a ser gravada em uma transação, apenas algumas leituras ocorrem antes. As atualizações/inserções são feitas em lote. A chave, que também é usada para identificar a linha a ser atualizada, é indexada com uma árvore b+. Essa chave também atua em outras tabelas como chave estrangeira. Nessas outras tabelas, a chave estrangeira pode ser nula.

O aplicativo não permite transações paralelas que contenham possíveis conflitos.

Aqui está o cabeçalho do arquivo de rastreamento:

Deadlock graph:
    ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-134b0012-3201376f        65     185     X             33     392           S
TX-13495007-50f092d1        33     392     X             65     185           S

session 185: DID 0001-0012-04533045 session 392: DID 0001-0023-03401G5A 
session 392: DID 0001-0023-03401G5A session 185: DID 0001-0012-04533045 

Rows waited on:
Session 588: no row
Session 497: no row

A inserção de um valor nulo em uma tabela referenciando a chave como uma chave estrangeira pode causar algum tipo de verificação da tabela (acho que não)? Uma inserção/atualização em lote pode fazer com que ramificações maiores de um índice sejam bloqueadas? Talvez T1 obtenha algum ramo esquerdo da árvore e T2 um ramo direito, e agora T1 deseja inserir/atualizar um valor no ramo direito, mas o ramo direito ainda está bloqueado por T2 e T" então solicita algo do lado esquerdo • Não faço ideia se e como o bloqueio de granularidade múltipla é implementado no Oracle, mas seria bom se alguém pudesse descartar isso.

Existe alguma possibilidade de o Oracle permitir deadlocks mesmo que as transações sejam 100% logicamente disjuntas?

O que eu poderia estar procurando? É algum problema para acessar o índice?

PS: leitura confirmada está definida.

oracle oracle-11g-r2
  • 1 1 respostas
  • 14398 Views

1 respostas

  • Voted
  1. Best Answer
    Vincent Malgrat
    2012-01-21T04:48:52+08:002012-01-21T04:48:52+08:00

    Deadlocks no Oracle com transações logicamente separadas geralmente envolvem chaves estrangeiras não indexadas :

    Existem dois problemas associados a chaves estrangeiras não indexadas. A primeira é o fato de que ocorrerá um bloqueio de tabela se você atualizar a chave primária do registro pai (muito incomum) ou se excluir o registro pai e a chave estrangeira do filho não for indexada.

    Os bloqueios no Oracle são gerenciados no nível da linha. Transações disjuntas simultâneas não devem interferir umas nas outras. Chaves estrangeiras não indexadas são uma exceção, pois podem resultar em um TABLE LOCK completo.

    Você deve obter o SQL no arquivo de rastreamento do impasse e isso deve ajudá-lo a restringir qual tabela/chave estrangeira é responsável pelo bloqueio. Depois de saber qual tabela é afetada pelo impasse, certifique-se de que todas as referências de chave estrangeira a essa tabela estejam indexadas corretamente. EG em seu exemplo T2.t1_iddeve ser indexado se apontar para T1.t1_id.

    Como alternativa, você pode usar o script de Tom Kyte no link acima para determinar se possui alguma chave estrangeira não indexada.


    Se você está bloqueado em inserções, geralmente significa que está tentando inserir linhas com os mesmos valores para um conjunto de colunas UNIQUE, por exemplo:

    CREATE TABLE T1 (col1 NUMBER NOT NULL, col2 NUMBER);
    ALTER TABLE T1 ADD CONSTRAINT T1_UNIQUE UNIQUE (col1, col2);
    
    session1> INSERT INTO T1 VALUES (1, NULL);
    session2> INSERT INTO T1 VALUES (2, NULL);
    session2> INSERT INTO T1 VALUES (1, NULL); -- <= this will wait on session1
    session1> INSERT INTO T1 VALUES (2, NULL); -- <= Deadlock !
    
    • 3

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve