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:
-
Aliceabre sua sessão do navegador que chamaDELETE FROM TABLE1 WHERE Version = 'v1'
Bobabre sua sessão que chamaDELETE FROM TABLE1 WHERE Version = 'v1'depois deAlicefez isso, mas antes de se comprometer.
Boba transação de espera desdeAlicebloqueou as linhas comVersion = 'v1'
-
Aliceconfirma sua transação
-
Boba transação de falha comCannot 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