Cuando el paralelismo muerde - ORA-12860 en un _high de Oracle Autonomous DB (OCI)

Autor
Damian
Terlecki
3 minutos de lectura
Bases de datos

Hace poco, estaba prototipando una app pequeña usando Oracle Autonomous Database en OCI. No lo pensé mucho y elegí el primer service name disponible con sufijo _high, sin imaginarme el lío que se venía. Al fin y al cabo, "_high" suena mejor que "_low", ¿no?

Un tiempo después, empecé a notar comportamientos raros, sobre todo al borrar y volver a insertar registros en una tabla dentro de la misma transacción.

La tabla era sencilla:

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

Tenía algunos registros y estaba intentando borrarlos y reinsertar tanto los antiguos como los nuevos:

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');
-- ...más inserts

De repente, aparece esto:

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

No era lo que esperaba para una operación tan simple.

Revisé la configuración de la tabla, índices, triggers... nada raro. Entonces caí: recordé que los servicios de la base están optimizados para distintos tipos de carga. El problema real resultó ser el nivel de paralelismo de la sesión al usar el servicio _high. Un vistazo rápido a gv$px_session desde una cuenta DBA confirmó que el valor de degree era mayor que 1.

Uniendo v$session y v$transaction por saddr obtuve más detalles. El DELETE inicial lanzaba 4 slaves en paralelo. Luego, los INSERT de las filas borradas antes provocaban un deadlock interno en la misma transacción.

Como era de esperar, cambiar al service name _low, que desactiva el paralelismo, resolvió el problema.

Si te topaste con el error ORA-12860 en algo parecido y llegaste aquí, espero que esta explicación te ahorre unos cuantos quebraderos de cabeza. Al momento de escribir esto, los resultados de búsqueda para este error no son muy útiles.

Consulta las descripciones de servicios de Oracle Autonomous Database en OCI para más información.