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>