Comportamiento Extraño cuando haces commit con SQL Server y ADO .NET??

|

Hace algunos dias estaba buscando por que habia un comportamiento extraño en un software que desarrolle y estaba en produccion ya durante años, pero por cosas de la vida le cambiaron de servidor y como era de esperarse dejo de funcionar...
Lo que sucedia en escencia es que al dar commit en una transaccion sql, por medio del objeto SQLTransaction de ADO .NET, resulta que daba errores como el siguiente: "
This SqlTransaction has completed; it is no longer usable" o "
System.NullReferenceException", la verdad no sabia que pasaba, segun yo el software no fue modificado para nada asi es que le heche la culpa a la base de datos!! Busque tanto que era lo que pasaba y di con algunas posibles explicaciones como por ejemplo que SQL Server no tenia los suficientes recursos y en consecuencia cerraba ciertas transacciones sin avisar, esto si pasaba en SQL 2000 pero lo parcharon, y ese tipo de cosas que suenan a veces un tanto extraordinarias...

No hay peor ciego que el que no quiere ver, asi reza el dicho, y es cierto, lo que sucede es que hace algunos años no era fanatico de lo que ahora se conoce como el Data Access Application Block de Enterprise Library, tenia una clase pequeña que hacia las veces de ese bloque de aplicacion, trataba claro que use las mejores practicas y todo, no se cuando sucedio pero tenia yo dentro de esta clase dos metodos que hacian commit o rollback a la transaccion, y se veian algo asi:


public static void CommitTran(SqlTransaction psqlTran)
{
psqlTran.Commit();
psqlTran.Connection.Close();
}

Pues resulta que nunca supe, aunque dedia suponerlo, que cuando uno usa el metodo Commit o Rollback de un Objeto SQLTransaction la conexion que usa se CIERRA!! y Claro en la segunda instruccion quiere cerrar la conexion que esta cerrada y ese es el origen del error!!
Que ciego!! Pase un buen tiempo luchando con esto por que tengo que agregar que no siempre se daba este error, lo cual es realmente extraño, pero como les digo solo hace falta el commit o el rollback, nada mas!! Entonces debe quedarles algo asi:


public static void CommitTran(SqlTransaction psqlTran)
{
psqlTran.Commit();
}

O mejor aun, usen el Enterprise Library con el Data Access Aplication Block, asi no cometeran errores como el mio!!!

Ojala les sirva!!

0 comments: