Quando o Paralelismo Atrapalha - ORA-12860 em um Oracle Autonomous DB _high (OCI)

Autor
Damian
Terlecki
3 minutos de leitura
Bancos de Dados

Recentemente, eu estava prototipando uma pequena aplicação usando o Oracle Autonomous Database na OCI. Não pensei muito e simplesmente escolhi o primeiro nome de serviço _high disponível, sem prever os problemas que viriam. Afinal, "_high" soa melhor que "_low", certo?

Algum tempo depois, comecei a notar um comportamento estranho, especialmente ao deletar e reinserir registros em uma tabela dentro da mesma transação.

A tabela era simples:

CREATE TABLE foo (
    bar_id      VARCHAR2(255) PRIMARY KEY,
    bar_user_id VARCHAR2(255) NOT NULL,
    bar_content VARCHAR2(2000)
);

Eu tinha alguns registros lá e estava tentando deletá-los e reinserir tanto os antigos quanto os novos:

DELETE FROM foo WHERE bar_user_id = 'some_user_id';

INSERT INTO foo (bar_id, bar_user_id, bar_content) VALUES ('old_id_1', 'some_user_id', 'new_content');
INSERT INTO foo (bar_id, bar_user_id, bar_content) VALUES ('old_id_2', 'some_user_id', 'new_content');
-- ...mais inserts

De repente, recebo isso:

ORA-12860: deadlock detected while waiting for a sibling row lock

Não era bem o que eu esperava de uma operação tão simples.

Verifiquei as configurações da tabela, índices, gatilhos - nada chamou a atenção. Então me dei conta - lembrei de algo sobre os serviços de banco de dados serem otimizados para diferentes cargas de trabalho. O problema real acabou sendo o nível de paralelismo da sessão ao usar o serviço _high. Uma rápida olhada em gv$px_session a partir de uma conta de DBA confirmou o valor de degree maior que 1.

Fazer um join entre v$session e v$transaction por saddr rapidamente me deu mais insights. O DELETE inicial estava gerando 4 slaves paralelos. Então, os INSERTs seguintes das linhas previamente deletadas causaram o deadlock interno dentro da mesma transação.

Sem surpresa, mudar para o nome de serviço _low, que desabilita o paralelismo, resolveu o problema.

Se você se deparou com o erro ORA-12860 por um motivo semelhante e encontrou este post, espero que esta rápida explicação tenha poupado um pouco de dor de cabeça. No momento em que escrevo, os resultados de busca para este erro não são muito úteis.

Veja as descrições dos serviços do Oracle Autonomous Database na OCI para mais informações.