Quando o Paralelismo Atrapalha - ORA-12860 em um Oracle Autonomous DB _high (OCI)
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.