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:
-
Alice
abre sua sessão do navegador que chamaDELETE FROM TABLE1 WHERE Version = 'v1'
Bob
abre sua sessão que chamaDELETE FROM TABLE1 WHERE Version = 'v1'
depois deAlice
fez isso, mas antes de se comprometer.
Bob
a transação de espera desdeAlice
bloqueou as linhas comVersion = 'v1'
-
Alice
confirma sua transação
-
Bob
a 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