InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
SubVersion y Visual Studio
Encriptación con AES Rijndael - Ejemplo
TripleDES - Un ejemplo practico en C#
Insertar una marca de agua en documentos PDF
Serialización: XmlSerializer y BinaryFormater
Handler para manipular imagenes
Tutorial rápido de Entity Framework y Linq To Entities
Conversiones de tipos personalizadas (VB y C#)
Compresión por gzip y deflate
La página Web que está abriendo contiene tanto elementos seguros como no seguros.


TransactionScope - Simplificando el trabajo con transacciones.

A partir del Framewrok 2.0 tenemos a nuestra disposición el objeto TransactionScope, que permite simplificar el trabajo con transacciones. Especialmente llamativo es la capacidad de promocionar la transacción a un entorno de transacciones distribuidas (MS DTC - COM+) de forma casi transparente .

Vamos a empezar con un ejemplo sencillito, de esos que no tienen que fallar nunca. Lo primero que debemos hacer es añadir una referencia a System.Transactions en nuestro proyecto.

Sobre una base de datos de prueba, creamos una nueva tabla para nuestro ejemplo.

 

CREATE TABLE

Persona

(CodPersona int IDENTITY,

Nombre varchar(50),

Apellido1 varchar(100),

Apellido2 varchar(100),

FechaNacimiento datetime,

CONSTRAINT PK_Persona PRIMARY KEY (CodPersona)

)

Para acceder a los datos vamos a utilizar LinqToSQL, por lo que añadimos un nuevo archivo de este tipo a nuestro proyecto. Por supuesto también podríamos trabajar con el modelo clásico de ADO.NET. Podemos ver como añadir clases de LinqToSQL a nuestro proyecto desde este enlace:
http://www.devjoker.com/contenidos/Articulos/326/LinQ-To-SQL--Un-ejemplo-sencillo.aspx

Ahora creamos un formulario - con un único botón - y añadimos el siguiente código al evento click del botón.

 

using (TransactionScope transactionScope = new TransactionScope())

{

try

{

AddData();

transactionScope.Complete();

MessageBox.Show("OK");

}

catch (Exception ex)

{

MessageBox.Show(ex.Message,

"Error - Se deshacen los cambios");

}

}

Con esto estamos envolviendo el código con un objeto TransactionScope - que crea a su vez una transacción controlada por el componente de Windows denominado LTM (Lightweight Transaction Coordinator) - es lo que se conoce como ambito o contexto de la transacción.

Posteriormente llamamos a un método que se encarga de grabar los registros en la base de datos y si todo ha ido bien confirmamos las transaccion con el método Complete(). Como vemos todo muy simple.

El método AddData es un simple bucle que inserta 100 registros en la base de datos. Lo vemos - no debemos tener ningún tipo de problema si hemos leido el artículo de LinqToSql que hemos mencionado antes.

 

private void AddData()

{

using (DataDataContext ctx = new DataDataContext())

{

for (int i = 0; i < 100; i++){

Persona p = new Persona();

p.Nombre = String.Format("Nombre {0}", i);

p.Apellido1 = String.Format("Apellido1 {0}", i);

p.Apellido2 = String.Format("Apellido2 {0}", i);

p.FechaNacimiento = DateTime.Now.AddMonths(i * -1);

ctx.Personas.InsertOnSubmit(p);

}

ctx.SubmitChanges();

}

}

Si consultamos los datos de la tabla Persona - que creamos en nuestra base de datos al principio del artículo -tendremos algo así:

CodPersona  Nombre     Apellido1      Apellido2       FechaNacimiento
----------- ---------- -------------- --------------- -----------------------
1           Nombre 0   Apellido1 0    Apellido2 0     2008-07-14 23:26:43.907
2           Nombre 1   Apellido1 1    Apellido2 1     2008-06-14 23:26:43.907
3           Nombre 2   Apellido1 2    Apellido2 2     2008-05-14 23:26:43.907
4           Nombre 3   Apellido1 3    Apellido2 3     2008-04-14 23:26:43.907
5           Nombre 4   Apellido1 4    Apellido2 4     2008-03-14 23:26:43.907
6           Nombre 5   Apellido1 5    Apellido2 5     2008-02-14 23:26:43.907 
...

Todo ha ido bien y no hemos debido tener ningún problema.

Ahora queremos comprobar que cuando las cosas fallan los cambios se deshacen correctamente. Para ello incluimos un nuevo método, que llamará al método de añadir registros (y que acabamos de ver que funciona correctamente) y una finalizada la inserción de datos lanzará un error..

 

private void AddDataWithError()

{

AddData();

throw new ApplicationException("Error provocado");

}

Y modificamos nuestro código para que se llame al método que lanza el error. 

 

using (TransactionScope transactionScope = new TransactionScope())

{

try

{

AddDataWithError();

transactionScope.Complete();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message,

"Error - Se deshacen los cambios");

}

}

Podemos comprobar que la aplicación muestra el mensaje de error y revierte correctamente las inserciones. Para ello insertamos un punto de detención (F9) en la línea que muestra el MessageBox de error. Cuando la ejecución de códgio se pare en el punto de detención, consultamos la base de datos con la siguiente instrucción:

 

SELECT * FROM Persona(NOLOCK)

En este momento podemos observar que se han inserado 100 nuevos registros, pero la transacción aún no ha sido confirmada - por eso debemos especificar NOLOCK para poder ver los datos. Continuamos la ejecución del código y volvemos a lanzar la consulta. La transacción se ha deshecho correctamente y los datos no se ha grabado. Funciona perfectamente.

Pero,¿como se está haciendo commit? ¿ donde se está haciendo el Rollback ? Cuando se crea una transacción utilizando TrasactionScope, se crea una transacción ligera que será controlada por un componente de Windows denominado LTM (Lightweight Transaction Coordinator),  es este componente el encargado de controlar la transacción. Por lo tanto, no es necesario hacer Rollback, una vez que salimos del ambito de la transacción los cambios se deshacen automanticamente si no han sido confirmados. Es decir, cuando salimos de la clausula using que contiene a TransactionScope.

Cuando en la transacción intervienen más de un recursos transaccional (diferentes bases de datos, colas ...) la transacción es promocionada, dejando de ser una transacción ligera - controladas por el LTM - y se convierte en una transacción distribuida - coordinada por el MS DTC (Distributed Transaction Coordinator). Es una técnica realmente potente que abordaremos en posteriores articulos. Como inveniente diremos que el coordinador de transacciones distribuidas en un componente COM+ y que por lo tanto se hace uso de interoperatividad con COM+ (y los problemas que ello puede suponer).

Saludos, DJK


 Versión para imprimir  Foros de consulta

 
Transacciones distribuidas por Lo entendido
Respuesta recibida el [30/01/2010 11:44:32]
Son aquellas que se agrupan en un bucle mientras que si la conección es correcta la publica y si la conección es falsa la elimina antes de hacer cualquier evento sin alterar el sistema de datos... eso creo yo pues.
El Tuto Salazar


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

TransactionScope - Simplificando el trabajo con transacciones.
Autor: Pedro Herrarte Sánchez
Visitas: 4870 Fecha de publicación: 11/08/2008
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 109 | Comentarios: 3 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 809 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 764 | Comentarios: 3 | Archivo: Articulos
Visitas: 3177 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14562 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1497 | Comentarios: 3 | Archivo: Articulos
Visitas: 695 | Comentarios: 2 | Archivo: Articulos
Visitas: 369 | Comentarios: 0 | Archivo: Articulos
Visitas: 2034 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
certificado por jhon jairo vargas ... [Actualidad] 1 13/03/2010
devolver consulta en form builder de oracle con like por cesar10lb ... [ORACLE] 0 13/03/2010
certificado de cesantias horizonte por yeimmy ... [Actualidad] 4 13/03/2010
solicito certificado de pensiones y sesantias para laborar por maria eugenia garcia m. ... [Actualidad] 0 13/03/2010
certificado de fondos de pensiones horizonte por mona ... [Actualidad] 6 03/03/2010
certificado pensiones por nelly moreno ... [Actualidad] 0 13/03/2010
certificado de pensiones del bbva horizonte por danger ... [Actualidad] 125 12/01/2010
cerificado fondo horizonte de pensiones y cesantias por carlos fideligno torres herrera ... [Actualidad] 147 18/01/2010
certuficado de afiliacion a porvenir por ede ... [Actualidad] 6 05/02/2010
certificado pensiones horizonte por angela patricia rodriguez ... [Actualidad] 136 26/01/2010
Solicitud certificado de afiliaciones a pensiones y cesantias proteccion por hz ... [Actualidad] 59 10/02/2010
necesito certificado de afiliacíon a pensiones por jelo ... [Actualidad] 0 12/03/2010

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
11/09/2006 Trabajar con datos de tipo BLOB en ORACLE
18/10/2005 Enviar emails a través de un servidor SMTP autenticado con Java
03/06/2008 Formatear números en SQL Server
27/10/2007 Lista de compatibilidad de software con Windows Mobile 5.0
15/07/2007 Consultas agregadas    forma parte de...Tutorial de Transact SQL
19/08/2006 Virtualización. Maquinas Virtuales.
24/05/2007 Tipos de datos en Transact SQL    forma parte de...Tutorial de Transact SQL
31/03/2006 Fundamentos de PL/SQL    forma parte de...Tutorial PL/SQL
20/04/2006 ASP.NET 2.0
14/10/2008 SET IDENTITY_INSERT ON y LinqToSQL

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]