Visual Basic.NET - Problema aislamiento OracleTransaction

   
Vista:

Problema aislamiento OracleTransaction

Publicado por Jorge Morales (2 intervenciones) el 19/05/2010 17:26:45
Saludos, 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


CREATE TABLE prueba (
campo1 number
)

'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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder