sql >> Base de Datos >  >> RDS >> Oracle

ORA-08177:no se puede serializar el acceso para esta transacción

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:

  1. Alice abre su sesión de navegador que llama a DELETE FROM TABLE1 WHERE Version = 'v1'

    • Bob abre su sesión que llama a DELETE FROM TABLE1 WHERE Version = 'v1' después de Alice lo hizo pero antes de comprometerse.

    Bob La transacción de espera desde Alice bloqueó las filas con Version = 'v1'

    • Alice confirma su transacción

    • Bob La transacción falla con Cannot 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