Límite de Transacciones con VB 6 + OLDB y SQL 2005

15/02/2012 - 19:52 por princich | Informe spam
hola, tengo un problema que me ha ocurrido no se porque razon; les
comento...

tengo una app vieja en vb6 con sql 2005.
lo tenía con conexión odbc y hace poco cambié a oldb
y despues de varios días del cambio me sale el siguiente error,
describo el escenario

tengo un formulario donde registro pacientes (mediante un stored
procedure) luego de registrar voy a un form donde en un dataGrid
mueestro unos datos en una grilla selecciono una y lueo inicio una
transsacion para registrar la internación del paciente, esta
transaccion tiene vs objetos dentro, actualiza vs tablas digamos...
sucede que ahora en el DE1.CO1.BeginTrans me da el siguiente error
"error '-2147168227 (8004D01D) no se puede crear una nueva transacción
se superó la capacidad"

y la verdad me perdió para siempre porque antes andaba y de un día
para otro dejó de funcionar

estoy arrancandome los pelos, por favor ayudenme, tengan piedad de un
programador que tiene que mantener app legacy
 

Leer las respuestas

#1 Leonardo Azpurua
16/02/2012 - 04:19 | Informe spam
Hola,

No tengo idea de la complejidad de tu aplicación, pero ese problema es
síntoma de una deficiencia conceptual relativamente grave.

Las actualizaciones a la BD se realizan dentro de un contexto, que
corresponde más o menos al concepto de "Controlador" en el pseudo-patrón
MVC.

La estructura de un contexto es más o menos así:

On Error GoTo manejoError
BeginTransaction
...
...
CommitTransaction

ResumePoint:
Exit Sub

manejoError:
RollBackTransaction
...
Resume ResumePoint

Las transacciones anidadas (incluso en un solo nivel) pueden no resultar
problematicas en casi todos los casos, pero siempre tienen un potencial de
problemas.

Cuando lo descubrí, tenía un sistema en producción, con varios cientos de
miles de lineas de código, y reorganizarlo era complicado.

Lo que hice fue reemplazar todas las apariciones de "dbHandle.Begin
Transaction" por "StartTransaction", y en el módulo donde tengo todas las
operaciones de acceso a BBDD escribí:

Private nTransactions As Integer

Public Sub StartTransaction()
If nTransactions = 0 Then
dbHandle.BeginTransaction
End If
nTransactions = nTransactions + 1
End Sub

Public Sub CommitTransaction()
If nTransactions = 0 Then
Err.Raise 20001, "lmdbHandle.CommitTransaction", "Llamada a Commit
fuera de una transaccion"
Else
nTransactions = nTransactions - 1
If nTransactions = 0 Then lmdbHandle.CommitTransaction
End If
End Sub

y cuando se llama a AbortTransaction (prefiero Abort a Rollback), si
nTransactions - 1 > 0, nuevamente levanto un error. No hay ni un sólo lugar
donde pueda requerirse revertir una transaccion "interior" sin abortar
tambien cualesquiera transacciones dentro de las cuales la operacion pueda
estar anidada.

Las operaciones "bien definidas" son "todo o nada"... No he logrado
encontrar un ejemplo práctico en el que una transaccion interna pueda fallar
sin que resulte necesario cancelar TODA la operacion en progreso.

La mejor manera de que tu aplicacion no se convierta en "legacy" es
perfeccionarla continuamente.


Salud!



"princich" escribió en el mensaje
news:
hola, tengo un problema que me ha ocurrido no se porque razon; les
comento...

tengo una app vieja en vb6 con sql 2005.
lo tenía con conexión odbc y hace poco cambié a oldb
y despues de varios días del cambio me sale el siguiente error,
describo el escenario

tengo un formulario donde registro pacientes (mediante un stored
procedure) luego de registrar voy a un form donde en un dataGrid
mueestro unos datos en una grilla selecciono una y lueo inicio una
transsacion para registrar la internación del paciente, esta
transaccion tiene vs objetos dentro, actualiza vs tablas digamos...
sucede que ahora en el DE1.CO1.BeginTrans me da el siguiente error
"error '-2147168227 (8004D01D) no se puede crear una nueva transacción
se superó la capacidad"

y la verdad me perdió para siempre porque antes andaba y de un día
para otro dejó de funcionar

estoy arrancandome los pelos, por favor ayudenme, tengan piedad de un
programador que tiene que mantener app legacy

Preguntas similares