Está utilizando una transacción serializable que espera a que otra transacción bloquee la misma tabla para ROLLBACK
.
Si esta otra transacción no retrocede sino que se confirma, obtendrá este error.
El escenario parece ser el siguiente:
-
Alice
abre su sesión de navegador que llama aDELETE FROM TABLE1 WHERE Version = 'v1'
Bob
abre su sesión que llama aDELETE FROM TABLE1 WHERE Version = 'v1'
después deAlice
lo hizo pero antes de comprometerse.
Bob
La transacción de espera desdeAlice
bloqueó las filas conVersion = 'v1'
-
Alice
confirma su transacción -
Bob
La transacción falla conCannot serialize access
Para evitar esto, establezca TRANSACTION ISOLATION LEVEL
a READ COMMITTED
:
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
En este caso, Bob
La consulta de se volverá a emitir después de Alice
confirma sus cambios, como si Bob
La transacción de se inició después de Alice
el de uno fue cometido.
Actualizar
¿Podría publicar un rastro de su conexión?
Para hacer esto, emita este comando justo después de conectarse:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
, luego busque en $ORACLE_HOME\admin\udump
para un nuevo *.trc
archivo