Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ORA-08177:não é possível serializar o acesso para esta transação


Você está usando uma transação serializável que espera por alguma outra transação bloqueando a mesma tabela para ROLLBACK .

Se essa outra transação não for revertida, mas for confirmada, você receberá esse erro.

O cenário parece ser o seguinte:

  1. Alice abre sua sessão do navegador que chama DELETE FROM TABLE1 WHERE Version = 'v1'
    • Bob abre sua sessão que chama DELETE FROM TABLE1 WHERE Version = 'v1' depois de Alice fez isso, mas antes de se comprometer.

    Bob a transação de espera desde Alice bloqueou as linhas com Version = 'v1'

    • Alice confirma sua transação

    • Bob a transação de falha com Cannot serialize access

Para contornar isso, defina TRANSACTION ISOLATION LEVEL para READ COMMITTED :
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

Neste caso, Bob a consulta de será reeditada após Alice confirma suas alterações, como se Bob a transação de foi iniciada após Alice o de um foi cometido.

Atualizar

Você poderia postar um rastreamento de sua conexão?

Para fazer isso, emita este comando logo após a conexão:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();

, em seguida, procure em $ORACLE_HOME\admin\udump para um novo *.trc Arquivo