Ver Mensaje Individual
  #1  
Antiguo 13-05-2010
Avatar de boreg
boreg boreg is offline
Miembro
 
Registrado: oct 2007
Ubicación: México, México
Posts: 76
Reputación: 17
boreg Va por buen camino
Exclamation Problema aislamiento OracleTransaction VB.NET

Saludos amigos, recientemente estoy desarrollando con VB.NET (VS2005) y Oracle (9i).

El problema que tengo es con una aplicacion que deberia funcionar de la siguiente manera

1.-Inicio transaccion (begintransaction(readcommitted))
2.-Inserto n registros
3.-Termino transaccion (commit)

En mi experiencia, los registros insertados deberian reflejarse en la BD hasta que se hace commit, pero eso solo sucede la primera vez que ejecuto el codigo ya que, a partir de la 2da, cada registro se refleja en la BD en cuanto es insertado, es decir, no es necesario hacer commit y si realizo un rollback los registros no se eliminan.

Haciendo pruebas encontre que si no especifico el nivel de aislamiento al iniciar la transaccion(begintransaction()), el codigo hace lo que (imagino) deberia hacer.

Lo raro es que al revisar el nivel de aislamiento por default es ReadCommitted

Me gustaria saber si es un bug y a alguien mas le ha pasado, si algo estoy haciendo mal o si me hace falta algo, de antemano gracias por sus comentarios.
Por lo pronto procedere a quitar la especificacion del aislamiento para que funcione correctamente.

Agrego el codigo utilizado en mis pruebas

Código SQL [-]

CREATE TABLE prueba (
campo1 number
)

Código:
'agregar referencia en el proyecto a System.Data.Oracleclient
'agregar en el formulario 2 textbox tbInicial y tbFinal, 2 botones Button1 y Button2

Public Class Form1
    Dim cnn As New OracleClient.OracleConnection
    Dim qr As New OracleClient.OracleCommand

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With cnn
                .ConnectionString = _
                    "User ID=usuario;" & _
                    "Password=password;" & _
                    "Data Source=servicio;" & _
                    "Persist Security Info=True"
                .Open()
        End With
        With qr
            .Connection = cnn
            .CommandType = CommandType.Text
            .CommandText = _
                " INSERT INTO PRUEBA " & _
                " VALUES ( " & _
                "   :VALOR) "
            .Parameters.Add(":VALOR", OracleClient.OracleType.Number)
        End With
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Ejecucion especificando isolationlevel
        Dim t As OracleClient.OracleTransaction = cnn.BeginTransaction(IsolationLevel.ReadCommitted)
        qr.Transaction = t
        For a As Integer = tbInicial.Text To tbFinal.Text
            qr.Parameters(":VALOR").Value = a
            qr.ExecuteNonQuery()
        Next
'a partir de la segunda ejecucion los registros se reflejan en la bd en este punto
        MsgBox("Se hara commit")
        t.Commit()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'Ejecucion sin especificacion de isolationlevel
        Dim t As OracleClient.OracleTransaction = cnn.BeginTransaction()
        qr.Transaction = t
        For a As Integer = tbInicial.Text To tbFinal.Text
            qr.Parameters(":VALOR").Value = a
            qr.ExecuteNonQuery()
        Next
        MsgBox("Se hara commit")
        t.Commit()
'los datos se reflejan en la bd hasta este punto
    End Sub
End Class
Gracias
Responder Con Cita