Pular para o conteúdo

Deadlock com INSERT

Deadlock com INSERT

É possível causar um Deadlock no Oracle com apenas uma tabela e INSERTs. O problema é causado pelos índices BITMAP, com índice B-TREE (o normal) isto não ocorreria.

Quando se insere um valor em uma coluna, todas as transações que alterem ou criem ocorrências deste valor terão que aguardar a conclusão da primeira transação, por COMMIT ou ROLLBACK.

Desta forma, em uma coluna indexada por índice Bitmap, ao inserir o número 1 em uma sessão, o 2 em outra, voltar na primeira sessão e inserir o número 2, e voltar na segunda sessão e inserir o número 1, ocorre o Deadlock: ambas sessões precisam que a outra termine para poderem prosseguir com a transação.

SESSÃO 1

C:\Users\Proni>sqlplus SCOTT/TIGER 
SQL*Plus: Release 11.2.0.2.0 Production on 
Sex Jul 22 14:14:36 2011 Copyright (c) 1982, 2010, Oracle. All rights reserved. 
Conectado a: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production With the Partitioning, Oracle Label Security, OLAP, Data Mining, Oracle Database Vault and Real Application Testing options 
SQL> CREATE TABLE T (COL1 NUMBER); Tabela criada. SQL> CREATE BITMAP INDEX IDX_T ON T(COL1); -ndice criado. SQL> INSERT INTO T VALUES (1); 1 linha criada.

SESSÃO 2

Microsoft Windows [versão 6.1.7601] 
Copyright (c) 2009 Microsoft Corporation. Todos os direitos reservados. 
C:\Users\Proni>sqlplus SCOTT/TIGER 
SQL*Plus: Release 11.2.0.2.0 Production on Sex Jul 22 14:15:34 2011 Copyright (c) 1982, 2010, Oracle. All rights reserved. 
Conectado a: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production With the Partitioning, Oracle Label Security, OLAP, Data Mining, Oracle Database Vault and Real Application Testing options 
SQL> INSERT INTO T VALUES (2); 1 linha criada.

SESSÃO 1:

SQL> INSERT INTO T VALUES (2);

Neste momento a Sessão 1 fica aguardando a conclusão da transação da Sessão 2.

SESSÃO 2:

SQL> INSERT INTO T VALUES (1);

Neste momento a Sessão 2 fica aguardando a conclusão da transação da Sessão 1, e logo uma das duas é considerada a vítima do Deadlock.

SESSÃO 1:

INSERT INTO T VALUES (2) 
* ERRO na linha 1: ORA-00060: conflito detectado ao aguardar recurso

Neste momento a Sessão 2 continua aguardando a conclusão da transação da Sessão 1. Ao sair da Sessão 1, eu finalizo a transação, o que permite a Sessão 2 prosseguir.

SESSÃO 1:

SQL> EXIT;

SESSÃO 2:

1 linha criada. 
SQL>
Ricardo Portilho Proni

Ricardo Portilho Proni

Com 20 anos de experiência profissional, Oracle ACE Member – eleito pela Oracle Corporation um dos maiores especialistas do mundo em Oracle Database- Trabalhou em grande parte dos maiores bancos de dados Oracle do Brasil. Certificado em Oracle, SQL Server, DB2, MySQL, Sybase e Websphere. Conselheiro do GPO e do GUOB, palestrante do ENPO, GUOB Tech Day e Oracle Open World, escritor da Revista SQL Magazine e Instrutor na Nerv.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Marcações:
plugins premium WordPress