Manejo de trasacciones en VB con Sybase

- En una aplicación necesito hacer una transacción que involucra alrededor de 16,000 registros (transacciones) divididos en 15 tablas.
- Cuando ejecuto este proceso se pierde la conexión con la base de datos, el error que me devuelve VB es: 'Referencia a objeto no establecidad'.
- En ocasiones el proceso si termina (con los mismos registros), pero la mayoría de las veces no.
- Revisando el log de la base de datos, no hay nada que me diga que hubo problemas con la transacción, la BD la detecta como en espera, cuando cancelo el proceso o mato la transacción en la BD se ejecuta el Rollback.
- Monitoreando la BD con DBArtisan, aparentemente por cada insert o update que se ejecuta se crea un log, en total tengo 16,000 log por todo el proceso.
- El proceso esta dividido en 8 subprocesos:
Subproceso 1
select T3
select T1
si exite T3 en T1: update T1
si no exite T3 en T1: insert T1
insert T2
insert T4
update T1
Subproceso 2
select T5
select T1
si exite T5 en T1: update T1
si no exite T5 en T1: insert T1
insert T2
insert T6
update T1
y asi sucesivamente para los demas subprocesos.
T1=180,000 registros
T2=800,000 registros
Las demás tablas tienen entre 15,000 y 25,000 registros.
- Las tablas tienen un nivel de bloqueo: all pages
- Para insertar en T2, debe existir en T1
-Para insertar en T4, debe existir en T3
-Para insertar en T6, debe existir en T4, Etc.

1 respuesta

Respuesta
1
No veo motivo de problema, lo que no veo es la sentencia de SQL que utilizas, pero has intentado el utilizar la ejecución directa de la conexión, ya que no veo el caso de crear un objeto command, si desde el método execute la propia conexión puedes hacerlo.
En mis códigos así lo hago, tengo procesos que tardan por lo menos quince minutos, leen datos, escriben, actualizan y demás y sin problemas.
Ahora, no veo en ningún lugar el uso de las transacciones.
Gracias por responder.
La cuestión del timeout ya se la puse y aun así se sigue perdiendo la conexión. La forma como me conecto es:
Private Const DSNenc As String = "lCnp8UOq......"
Private DSN As String
Private Conn As New Odbc.OdbcConnection
Public Sub New(ByVal DB As String)
DSN = Enc.DecryptBaseString ...
Conn.ConnectionTimeout = 0
Conn.ConnectionString = DSN & DB & ";"
Me.Conn.Open()
End Sub
Y esta es la forma como mando llamar cada proceso de insert o update
Public Function Q(ByVal SQL As String) As Boolean
Dim cmm As New Odbc.OdbcCommand
cmm.CommandText = SQL
cmm.Connection = Me.Conn
If CType(cmm.ExecuteNonQuery, Boolean) Then
Return True
Else
Return False
End If
End Function
Checa la propiedad de timeout de la conexión que tienes a base de datos, ya que por ahí se esta terminando el tiempo de espera y se desconecta el proceso que realizas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas