Pelo que pesquisei é um erro mais comum de acontecer em um merge, mas nunca tinha visto em um update.ORA-30926: unable to get a stable set of rows in the source tables
Cause: A stable set of rows could not be got because of large dml activity or a non-deterministic where clause.
Action: Remove any non-deterministic where clauses and reissue the dml.
Esse é o SQL que faz o update:
UPDATE available_numbers_view n
SET n.id_transact = ?,
n.date_updated =?
WHERE ROWNUM <=?
AND n.uid =?
AND n.region_code =?
AND n.status =?
AND n.blocked =?
AND n.reserved IS NULL
O problema disso é que a aplicação tem múltiplas instâncias e esse processo começou a ser executado com uma frequência muito alta, gerando problemas de lock e vários eventos de "enq: TX - row lock contention" foram observados no AWR.
Isso é devido ao update retornar sempre o mesmo registro na clausula where e várias instancias tentando atualizar o mesmo registro.
Eu usei uma solução não muito elegante, fazendo um select e ordenando os resultados com dbms_random.value e filtrando por rownum ao final para garantir que as instancias não tentem atualizar o mesmo registro.
O design da aplicação não permite utilizar o select for update skip locked, que seria uma alternativa melhor.
Alguém já enfrentou um problema parecido?