oracle exception ora-08177

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



exception (1)

Tengo un código muy simple usando ADO.NET que arroja la excepción ORA-08177. No estoy seguro de qué pasa con esto. Estoy intentando esto en una máquina de Windows Vista que tiene instalado el cliente Oracle de 32 bits. Mi opción de compilación para Visual Studio está configurada en la plataforma x86.

Dim connection As OracleConnection = Nothing Dim transaction As OracleTransaction = Nothing Try connection = New OracleConnection("Data Source=ora10;User Id=userid;Password=passwd;") connection.Open() transaction = connection.BeginTransaction(IsolationLevel.Serializable) Dim inputStream As New System.IO.FileStream("Dummy.xls", IO.FileMode.Open) Dim fileLength As Integer = CType(inputStream.Length, Integer) Dim input(fileLength) As Byte Try inputStream.Read(input, 0, fileLength) Finally If inputStream IsNot Nothing Then inputStream.Close() End Try Dim deleteSql As String = "DELETE FROM TABLE1 WHERE Version = ''v1'' " Dim cmd As New OracleCommand(deleteSql, connection, transaction) cmd.ExecuteNonQuery() Dim insertQuery As String = "INSERT INTO TABLE1 (VERSION, DATA) VALUES (:VERSION, :DATA) " Dim insertCmd As OracleCommand = New OracleCommand(insertQuery, connection, transaction) insertCmd.Parameters.Clear() insertCmd.CommandType = Data.CommandType.Text insertCmd.Parameters.AddWithValue(":VERSION", "v1") insertCmd.Parameters.AddWithValue(":DATA", input) insertCmd.ExecuteNonQuery() transaction.Commit() Catch If transaction IsNot Nothing Then transaction.Rollback() Throw Finally If transaction IsNot Nothing Then transaction.Dispose() If connection IsNot Nothing AndAlso connection.State <> ConnectionState.Closed Then connection.Close() End Try

Algo importante a tener en cuenta: (no estoy seguro de si están conectados) pero no me enfrento a este problema si desinstalo las últimas actualizaciones de Windows de mi máquina.

¿Alguien ha enfrentado esto o tiene alguna pista sobre lo que está pasando aquí?

Editar:-

Tengo algún progreso en el que descubrí que este problema ocurre solo cuando tenemos el tipo de columna blob en cuestión. para columnas simples funciona bien.

Otros detalles (no estoy seguro si eso hace la diferencia)

Estoy trabajando en la máquina de negocios Windows Vista de 64 bits. He instalado un cliente Oracle de 32 bits para Windows Vista (dado que el cliente Oracle de 64 bits no funciona en Vista). Estoy compilando mi proyecto para un x86 (entorno de 32 bits) en Visual Studio. Y esta es una aplicación de consola y sé que nadie más está accediendo a la base de datos en este momento. entonces no puede haber múltiples transacciones.

Y no veo este problema si desinstalo la última actualización de Windows. (KB963027, KB967190, KB959426, KB960225, KB960803, KB952004, KB956572, KB958687, KB958690, KB958481, KB958483, KB943729)


Está utilizando una transacción serializable que espera que otra transacción bloquee la misma tabla en ROLLBACK .

Si esta otra transacción no se revierte sino que se compromete, obtendrá este error.

El escenario parece ser el siguiente:

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

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

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

    • Alice comete su transacción

    • La transacción de Bob falla con Cannot serialize access

Para solucionar esto, configure TRANSACTION ISOLATION LEVEL para READ COMMITTED :

transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

En este caso, la consulta de Bob volverá a emitir después de que Alice confirme sus cambios, como si la transacción de Bob hubiera iniciado después de que se cometió la de Alice .

Actualizar

¿Podría por favor 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();

, busque en $ORACLE_HOME/admin/udump para obtener un archivo *.trc