REALIZAR OPERACIONES TRANSACCIONALES

28
REALIZAR OPERACIONES TRANSACCIONALES TEMA Transacciones en ADO .NET OBJETIVOS ESPECÍFICOS Identificar los diferentes tipos de transacciones en ADO .NET: locales, Distribuidas Manejar las transacciones en una capa de datos. CONTENIDOS Definición de una transacción. Definición y manejo de transacciones implícita y explícita. Manejo de transacciones en la capa de datos Manejo de una transacción distribuida. ACTIVIDADES

description

Lenguaje de programacion

Transcript of REALIZAR OPERACIONES TRANSACCIONALES

REALIZAR OPERACIONES TRANSACCIONALES

TEMA Transacciones en ADO .NET

OBJETIVOS ESPECFICOS Identificar los diferentes tipos de transacciones en ADO .NET: locales, Distribuidas Manejar las transacciones en una capa de datos.

CONTENIDOS Definicin de una transaccin. Definicin y manejo de transacciones implcita y explcita. Manejo de transacciones en la capa de datos Manejo de una transaccin distribuida.

ACTIVIDADES Desarrollan de modo terico prctico las diversas transacciones en ADO .NET.

1 QU ES UNA TRANSACCIN

Cuando se compra un libro de una librera en lnea, se intercambia dinero (en forma de crdito) por el libro. Si el crdito es correcto, una serie de operaciones relacionadas garantiza que se obtiene el libro y que la librera obtiene el dinero. Sin embargo, si una operacin sufre un error durante el intercambio, el error afecta a la totalidad del intercambio. No se obtiene el libro y la librera no obtiene el dinero.

Las transacciones garantizan que los recursos orientados a datos no se actualicen permanentemente, salvo que todas las operaciones de la unidad transaccional se completen de forma satisfactoria.

2 TRANSACCIONES EXPLCITAS E IMPLCITAS

Los programadores de aplicaciones de transacciones pueden sacar partido de los dos modelos de programacin que proporciona el espacio de nombres System.Transactions para crear una transaccin. Puede utilizar el modelo de programacin explcito mediante la claseTransaction o el modelo de programacin implcito en el que la infraestructura administra de forma automtica las transacciones por medio de la clase TransactionScope.

Ambos modelos admiten la confirmacin de una transaccin cuando el programa alcanza un estado coherente. Si la confirmacin se ejecuta correctamente, la transaccin se confirma de forma duradera. Si la confirmacin no se realiza correctamente, la transaccin se anula. Si el programa de aplicacin no puede realizar correctamente la transaccin, intenta anular y deshacer los efectos de la transaccin.

Implementacin de una transaccin explcita con CommittableTransaction

La clase Committable Transaction proporciona un modo explcito de que las aplicaciones utilicen una transaccin.

Es til para las aplicaciones que desean utilizar la misma transaccin en varias llamadas a funciones o varias llamadas a subprocesos. A diferencia de lo que sucede con la clase TransactionScope, quien escribe las aplicaciones tiene que llamar de forma especfica a los mtodos Commit y RollBack para confirmar o anular la transaccin. Cuando se implementa una transaccin, se debe llamar al mtodo BeginTransaction dentro del objeto de conexin. Al crear la transaccin, puede especificar el nivel de aislamiento que se aplica a la transaccin.

El nivel de aislamiento de una transaccin determina qu nivel de acceso tienen otras transacciones a los datos variables antes de que finalice una transaccin. Si va especificar el nivel de aislamiento, pasar un valor enumerable de System.Data.IsolationLevel dentro del mtodo BeginTransaction. Los valores numerables del IsolationLevel:

Mtodo Descripcin

ChaosLos cambios pendientes de las transacciones ms aisladas no se pueden sobrescribir.

ReadCommittedLos datos variables no se pueden leer durante la transaccin, pero se pueden modificar.

ReadUncommittedSe pueden leer datos variables y modificarse durante la transaccin.

SerializableSe pueden leer datos variables pero no modificarse y no se pueden agregar nuevos datos durante la transaccin.

SnapshotSe pueden leer los datos variables. Antes de que una transaccin modifique los datos, comprueba si otra transaccin ha cambiado los datos despus de haberlos ledo inicialmente. Si se han actualizado los datos, se produce un error. Esto permite a una transaccin llegar al valor previamente confirmado de los datos.Cuando intenta promocionar una transaccin que se ha creado con este nivel de aislamiento, se produce una excepcin InvalidOperationException con el mensaje de error "No se pueden promocionar transacciones con el nivel de aislamiento Snapshot".

Actualizacin de una base de datos dentro de una transaccin local

En el siguiente ejemplo, actualizaremos el stock y el precio de un determinado artculo.

Declarar el objeto SqlConnection Dim cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true")

Abrir el objeto Conection; crear el objeto transaction y asignarle al Transaction BeginTransaction del objeto Connection con el nivel de Isolation Serializable, es decir, no se podr leer hasta que actualice los datos

Dim success As Boolean = Truecn.Open()Dim tr As SqlTransaction tr = cn.BeginTransaction(IsolationLevel.Serializable)

Para cada comando que se va a ejecutar dentro de la transaccin, asignar la propiedad Transaction para referir al objeto transaccin.

Using cmd As New SqlCommand("Update dbo.Articulos Set art_precio = art_precio + 15 Where art_codigo='a0002'", cn, tr) Dim i As Integer = cmd.ExecuteNonQuery If i > 0 Then Using cmd1 As New SqlCommand("Update dbo.Articulos Set art_stock = art_stock + 15 Where art_codigo='a0002'", cn, tr) i = cmd1.ExecuteNonQuery If i > 0 Then success = True End If End Using 'Libera el Command que actualiza el Stock End IfEnd Using 'Libera el Command que actualiza el precio

Si los comandos se ejecutaron con xito, es decir, la variable success es true, llamar al mtodo Commit del objeto Transaction; si hubo un problema, llamar al mtodo RollBack para cancelar las actualizaciones.If success = True Then tr.Commit()Else tr.Rollback()End If

Los objetos command se liberarn dentro del Using, luego cerrar la conexin

cn.Close()

3 MANEJO DE TRANSACCIONES EN LA CAPA DE DATOS

Se puede manejar transacciones en la capa de datos (Data Tier) utilizando sentencias SQL, dentro de un procedimiento almacenado y triggers o disparadores, al iniciar una transaccin, al comitear la transaccin y al deshacer los cambios (rollback) en la transaccin.

La siguiente tabla muestra algunas de las sentencias SQL que se utilizan para manejar transacciones dentro de la capa de datos

Sentencia SQLDescripcin

BEGIN TRANSACTIONMarca el inicio de una transaccin local.

COMMIT TRANSACTIONMarcar el fin de una transaccin completada con xito, y comitea o actualiza los cambios efectuados despus del BEGIN TRANSACTION.

ROLLBACK TRANSACTIONMarca el fin de una transaccin no completada con xito, y cancela todos los cambios efectuados despus del BEGIN TRANSACTION.

Manejo de una transaccin explcita en la capa de datos

Crear un procedimiento almacenado En el procedimiento almacenado, iniciar una transaccin (BEGIN TRANSACTION) Colocar las sentencias de actualizacin dentro de la transaccin Si todas las operaciones se ejecutaron correctamente, comitear la transaccin, pero si la operacin fall, deshacer los cambios a la transaccin

El siguiente ejemplo muestra cmo manejar una transaccin en un procedimiento almacenado. El procedimiento almacenado crea una transaccione y ejecuta dos sentencias de actualizacin dentro de la transaccin. Si se ejecut satisfactoriamente se aplicar Commit, si hubo al error se aplicar RollBack.

CREATE PROCEDURE dbo.UpdatePrecios@codprod1 char(5),@codprod2 char(5)As DECLARE @success BIT Select @success=0

BEGIN TRANSACTION Update dbo.Articulos Set art_precio=art_precio * 1.5 Where art_codigo=@codprod1 if(@@error=0 AND @@rowcount=1)Begin Update dbo.Articulos Set art_precio=art_precio * 2.0 Where art_codigo=@codprod2

if(@@error=0 AND @@rowcount=1) Select @success=1End If @success=1COMMIT TRANSACTION ElseROLLBACK TRANSACTIONReturnInicia la transaccin donde las actualizaciones se agrupan a partir de aquSentencia de actualizacin de precios por un artculo Si los procesos se ejecutan satisfactoriamente, se aplicar COMMIT, sino se aplicara ROLLBACK

3 MANEJO DE TRANSACCIONES DISTRIBUIDASLas transacciones distribuidas permiten incorporar en una sola accin de cumplimiento o incumplimiento varias operaciones distintas que tienen lugar en sistemas diferentes. La clase System.Transactions.TransactionScope proporciona un manera sencilla de marcar un bloque de cdigo como participante en una transaccin, sin que el usuario tenga que interactuar con la transaccin.

Un mbito de transaccin puede seleccionar y administrar la transaccin de ambiente de forma automtica. Gracias a su fcil uso y a su eficacia, se recomienda utilizar la clase TransactionScope cuando se desarrolle una aplicacin de transaccin. Adems, no es necesario inscribir recursos de forma explcita con la transaccin. Cualquier administrador de recursos de System.Transactions (como SQL Server 2005) puede detectar la existencia de una transaccin de ambiente creada por el mbito e inscribirla de forma automtica.Crear un mbito de transaccin, utilizando TransactionScopeUsing scope As TransactionScope = New TransactionScope() ...

End Using

La clase TransactionScope proporciona varios constructores sobrecargados que aceptan una enumeracin del tipo TransactionScopeOption, que define el comportamiento transaccional del mbito. Un objeto TransactionScope tiene tres opciones:Opcin Descripcin

RequiredHay presente una transaccin de ambiente. El ambiente se une a esa transaccin. Si no existe ninguna transaccin, el ambiente crea una nueva. Es el valor por defecto

RequiresNewLa transaccin siempre crea una nueva transaccin.

SupressNunca participa en una transaccin, independientemente si hay una transaccin presente. Por lo tanto, no existir ninguna transaccin.

Completar un mbito de transaccinCuando la aplicacin finalice, todo el trabajo que desea llevar a cabo en una transaccin se debe llamar al mtodo Complete slo una vez para informar al administrador de transacciones que se puede confirmar la transaccin. Es muy conveniente realizar la llamada a Complete como ltima instruccin en el bloque using. Si no se llama a este mtodo, la transaccin se anula, ya que el administrador de transacciones lo interpreta como un error del sistema o como una excepcin iniciada dentro del mbito de transaccin.

La instruccin using garantiza que se llame al mtodo Dispose del objeto TransactionScope aunque se produzca una excepcin. El mtodo Dispose marca el final del mbito de transaccin. Puede que las excepciones que tienen lugar despus de llamar a ese mtodo no afecten a la transaccin. Este mtodo, tambin, restaura la transaccin de ambiente a su estado anterior.

Deshacer una transaccinSi desea deshacer una transaccin, no debe llamar al mtodo Complete dentro del mbito de transaccin. Por ejemplo, puede iniciar una excepcin en el mbito. La transaccin en la que ste participa se deshar.

En el ejemplo siguiente, se muestra un objeto TransactionScope que crea tres objetos de mbito anidados, cada uno con una instancia con un valor de TransactionScopeOption distinto.

Using scope1 As New TransactionScope() 'Default is Required Using scope2 As New TransactionScope( _ TransactionScopeOption.Required) '..... End Using

Using scope3 As New TransactionScope( _ TransactionScopeOption.RequiresNew) '... End Using

Using scope4 As New TransactionScope( _ TransactionScopeOption.Suppress) '... End UsingEnd Using

El ejemplo muestra un bloque de cdigo en el que ninguna transaccin de ambiente crea un nuevo mbito (scope1) con Required. El mbito scope1 es un mbito raz ya que crea una nueva transaccin (Transaccin A) y convierte la transaccin A en la transaccin de ambiente. Scope1 crea, a continuacin, tres objetos ms, cada uno con un valor de TransactionScopeOption distinto. Por ejemplo, scope2 se crea con Required y, puesto que existe una transaccin de ambiente, se une a la primera transaccin creada por scope1. Tenga en cuenta que scope3 es el mbito raz de una nueva transaccin y que scope4 no tiene ninguna transaccin de ambiente.Aunque el valor predeterminado y ms utilizado de TransactionScopeOption es Required, cada uno de los dems valores tiene una finalidad propia. Suppress es til cuando se desean conservar las operaciones realizadas por la seccin de cdigo y no se desea anular la transaccin de ambiente si las operaciones presentan errores.

LABORATORIO 1USO DE TRANSACCIONES LOCALESEn este escenario realizaremos el proceso de actualizacin de los clientes registrados en la base de datos BDFactura utilizando transacciones (transacciones explcitas).

1. Ingrese a Visual Studio 20052. Seleccione en el men Files -> New ->Project3. Elija las siguientes opciones de la ventana para crear un nuevo proyectoa. En Project Types elija Visual Basicb. En Templates elija WindowsApplicationc. En name coloque appFacturacion03d. En Location coloque C:\CursoPOOII 4. Disee la siguiente interface

ObjetoNamePropiedadValor

Label1Label1TextCodigo

Label2Label2TextNombre

Label3Label3TextDireccion

Label4Label4TextFono

Label5Label5TextRuc

Textbox1TxtcodigoText

Textbox2TxtnombreText

Textbox3TxtdireccionText

Textbox4TxtfonoText

Textbox5TxtrucText

Button1BtnLimpiarTextLimpiar

Button2BtnGrabarTextGrabar

Button3BtnBuscarTextBuscar

Button4BtnModificarTextModificar

Button5BtnEliminarTextEliminar

DataGridView1DGCliente

5. Defina los namespaces: System.Data.SqlClient y System.Transaction6. Defina e inicializar la cadena de conexin a nivel Class Form

Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true")

7. Defina la funcin DataClientes que retorne los registros de los clientesFunction DataClientes() As DataTable Dim da As New SqlDataAdapter("Select * from Clientes", cn) Dim t As New DataTable da.Fill(t) Return tEnd Function

8. En el evento Load del Form, cargamos los registros de los clientes en el DataGridView DGClientes y configuramos el DataGridView para que no se pueda aadir registros Me.DGCliente.AllowUserToAddRows = False Me.DGCliente.DataSource = DataClientes()Indica no se puede aadir registros

9. Para navegar por los registros del DataGridView DGCliente y al seleccionar un registro se visualice en los Textboxes, se deber programar en el evento CellClickWith DGCliente.CurrentRow txtcodigo.Text = .Cells(0).Value txtnombre.Text = .Cells(1).Value txtfono.Text = .Cells(2).Value txtruc.Text = .Cells(3).Value txtdireccion.Text = .Cells(4).ValueEnd WithCurrentRow se obtiene el valor de las columnas, el valor de la primera columa:CurrentRow.Cells(0).ValueCurrentRow representa la fila actual

10. En el evento Click del botn Limpiar, limpie los controles del Form. Me.txtcodigo.Text = "" Me.txtnombre.Text = "" Me.txtdireccion.Text = "" Me.txtfono.Text = "" Me.txtruc.Text = "" Me.txtcodigo.Focus()

11. En el evento Click del botn Guarde, ingresar un nuevo cliente:a. Abrir la conexinb. Crear una transaccin, cuyo nivel de aislamiento es serializablec. Dentro del Try crear un SqlCommand, aadir los parmetrosd. Ejecutar el comando con el mtodo ExecuteNonQuerye. Si se proces correctamente, se ejecutar el mtodo Commitf. Si el proceso tuvo un error, se desencadena el Catch y se ejecutar el mtodo RollBack de la transaccin tr.g. Al finalizar el proceso, se cerrar la conexin. cn.Open() Using tr As SqlTransaction = _ cn.BeginTransaction(Data.IsolationLevel.Serializable) Try Dim cmd As New SqlCommand( _ "Insert Into dbo.Clientes(cli_codigo,cli_nombre, cli_direccion,cli_telefono,cli_ruc) Values(@cod, @nom, @dir, @fono, @ruc)", cn, tr) With cmd.Parameters .Add("@cod", SqlDbType.Char).Value = txtcodigo.Text .Add("@nom", SqlDbType.VarChar).Value = txtnombre.Text .Add("@dir", SqlDbType.VarChar).Value = txtdireccion.Text .Add("@fono", SqlDbType.VarChar).Value = txtfono.Text .Add("@ruc", SqlDbType.VarChar).Value = txtruc.Text End With cmd.ExecuteNonQuery() tr.Commit() Me.DGCliente.DataSource = DataClientes() Catch ex As SqlException MessageBox.Show(ex.Message) tr.Rollback() Finally cn.Close() End Try End Using

12. En botn modificar, actualizar los datos de un cliente; en el evento Click del botn modificar, se ejecutar el proceso de actualizacin del cliente:a. Crear una transaccin, cuyo nivel de aislamiento es serializableb. Dentro del Try crear un SqlCommand, aadir los parmetros.c. Ejecutar el comando con el mtodo ExecuteNonQuery, este mtodo retorna el nmero de registros afectados donde es almacenado en c.d. Si el valor de c es 1, ejecutar el mtodo Commit, caso contrario se ejecutar el mtodo RollBack de la transaccin tr.

cn.Open() Using tr As SqlTransaction = _ cn.BeginTransaction(Data.IsolationLevel.Serializable) Try Dim cmd As New SqlCommand( _ "Update dbo.Clientes Set cli_nombre=@nom, cli_direccion=@dir, cli_telefono=@fono, cli_ruc=@ruc Where cli_codigo=@cod", cn, tr) With cmd.Parameters .Add("@nom", SqlDbType.VarChar).Value = txtnombre.Text .Add("@dir", SqlDbType.VarChar).Value = txtdireccion.Text .Add("@fono", SqlDbType.VarChar).Value = txtfono.Text .Add("@ruc", SqlDbType.VarChar).Value = txtruc.Text .Add("@cod", SqlDbType.Char).Value = txtcodigo.Text End With Dim c As Int16 = cmd.ExecuteNonQuery() If c = 1 Then tr.Commit() DGCliente.DataSource = DataClientes() Else tr.Rollback() MessageBox.Show("No se Actualizado") End If Catch ex As SqlException MessageBox.Show(ex.Message) tr.Rollback() Finally cn.Close() End Try End Using

13. En el botn eliminar, se eliminar un cliente; en el evento Click del botn eliminar, se ejecutar el proceso de eliminacin del cliente:a. Abrir la conexinb. Dentro del Try crear un SqlCommand, aadir los parmetrosc. Ejecutar el comando con el mtodo ExecuteNonQuery. Este mtodo retorna el nmero de registros afectados donde es almacenado en c.d. Si el valor de c es 1, se procede a aplicar Commit y a actualizar el DataGridView; caso contrario se aplicar RollBack.e. Si se proces correctamente, se ejecutar el mtodo Commit de la transaccin tr.f. Si el proceso tuvo un error, se desencadena el Catch y se ejecutar el mtodo RollBack de la transaccin tr.g. Al finalizar el proceso, cerrar la conexin

cn.Open() Using tr As SqlTransaction = _ cn.BeginTransaction(Data.IsolationLevel.Serializable) Try Dim cmd As New SqlCommand( _ "Delete From dbo.Clientes Where cli_codigo=@cod", cn, tr) With cmd.Parameters .Add("@cod", SqlDbType.Char).Value = txtcodigo.Text End With Dim c As Int16 = cmd.ExecuteNonQuery() If c = 1 Then tr.Commit() MessageBox.Show("Cliente Eliminado") Me.DGCliente.DataSource = DataClientes() Else tr.Rollback() MessageBox.Show("No se Elimino") End If Catch ex As SqlException MessageBox.Show(ex.Message) tr.Rollback() Finally cn.Close() End Try End Using

14. Cmo desarrollara el proceso de bsqueda de un cliente? Aplique sus ideas dentro del ejercicio15. Ejecutar la aplicacin y verificar los resultados

LABORATORIO 2 TRANSACCIONES DISTRIBUIDAS, TRANSACTIONSCOPEEn este escenario, se aplicar un caso donde se trabajar con dos base de datos: BDFactura y BDAlmacen. En ellas, se actualizarn los datos sobre dos tablas: artculos en BDFactura y kardex en BDAlmacen: Cuando se agregue un nuevo artculo, ste se agregar en el kardex Cuando se actualice el stock de artculos, se actualizar el stock en el kardexLa estructura de las tablas es la siguiente:DATABASE BDFACTURACREATE TABLE ARTICULOS(art_codigo char(5) primary key,art_nombre varchar(30),art_unidad char(4),art_precio Decimal,art_stock int)DATABASE BDALMACENCREATE TABLE KARDEX(kar_codigo char(5) primary key,har_nombre varchar(30),kar_unidad char(4),kar_stock int)

1. Agregue un formulario al proyecto2. Disee la siguiente interface.

ObjetoNamePropiedadValor

Label1Label1TextCodigo

Label2Label2TextDescripcin

Label3Label3TextUnidad

Label4Label4TextPrecio

Label5Label5TextStock

Textbox1TxtcodigoText

Textbox2TxtdescripcionText

Textbox3TxtunidadText

Textbox4TxtprecioText

Textbox5TxtstockText

Button1BtnLimpiarTextLimpiar

Button2BtnGrabarTextGrabar

Button3BtnActualizarTextActualizar

DataGridView1DGArticulos

3. Definir los Namespaces: System.Data.SqlClient y System.Transaction.4. Definir e inicializar la cadena de conexin a nivel Class Form

Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true")

5. Definir la funcin DataArticulos que retorne los artculos.Function DataArticulos() As DataTable Dim da As New SqlDataAdapter("Select * from Articulos", cn) Dim t As New DataTable

da.Fill(t) Return tEnd Function

6. En el evento Load del Form, llenar los datos en DGArticulosMe.DGArticulos.DataSource = DataArticulos()

7. Programar el evento CellClick del DataGridView DGArticulos donde al seleccionar un registro se visualice en los Textboxes8. Programar el evento Click del control BtnLimpiar.9. En botn Guardar, registrar un nuevo artculo y registrar en el kardex:a. Abrir la conexin y crear una conexin para BDAlmacenb. Crear un transaccin Scope de tipo Requiredc. Establecer la estructura Try Catch Finally para controlar las excepcionesd. Dentro del Try, definir un Command que ejecutar una sentencia de insercin a los artculos.e. Ejecutar el comando con el mtodo ExecuteNonQueryf. En el Command, definir la sentencia de insercin al kardex.g. Ejecutar el mtodo Complete de la transaccin.h. Si el proceso tuvo un error, se desencadena el Catch.i. Al finalizar el proceso, se cerrar las conexiones.

cn.Open()cnk.Open()Using tr As New TransactionScope( _ TransactionScopeOption.Required) Try Dim cmd As New SqlCommand("Insert Articulos(art_codigo, art_nombre,art_unidad,art_precio,art_stock) Values(@cod, @nom, @uni, @pre, @st)", cn) With cmd.Parameters .Add("@cod", SqlDbType.Char).Value = txtcodigo.Text .Add("@nom", SqlDbType.VarChar).Value = txtdescripcion.Text .Add("@uni", SqlDbType.VarChar).Value = txtunidad.Text .Add("@pre", SqlDbType.Decimal).Value = Val(txtprecio.Text) .Add("@st", SqlDbType.Int).Value = Val(txtstock.Text) End With cmd.ExecuteNonQuery()

cmd = New SqlCommand("Insert Kardex(kar_codigo,har_nombre, kar_unidad,kar_stock) Values(@cod, @nom, @uni,@st)", cnk) With cmd.Parameters .Add("@cod", SqlDbType.Char).Value = txtcodigo.Text .Add("@nom", SqlDbType.VarChar).Value = txtdescripcion.Text .Add("@uni", SqlDbType.VarChar).Value = txtunidad.Text .Add("@st", SqlDbType.Int).Value = Val(txtstock.Text) End With cmd.ExecuteNonQuery()

tr.Complete() MessageBox.Show("Articulo Agregado") Me.DGArticulos.DataSource = DataArticulos()

Catch ex As SqlException MessageBox.Show(ex.Message) Finally cn.Close() : cnk.Close() End TryEnd Using

10. En botn actualizar, actualizar el stock en artculo y en kardex:a. Abrir la conexin y crear una conexin para BDAlmacenb. Crear un transaccin Scope de tipo Requiredc. Establecer la estructura Try Catch Finally para controlar las excepcionesd. Dentro del Try, definir un Command que ejecutar una sentencia de insercin a los artculos.e. Ejecutar el comando con el mtodo ExecuteNonQueryf. En el Command, definir la sentencia de insercin al kardex.g. Ejecutar el mtodo Complete de la transaccin. h. Si el proceso tuvo un error, se desencadena el Catch.i. Al finalizar el proceso, se cerrar las conexiones.

cn.Open()cnk.Open() Using tr As New TransactionScope() Try Dim cmd As New SqlCommand("Update dbo.Articulos Set art_stock = @st Where art_codigo=@cod", cn) With cmd.Parameters .Add("@st", SqlDbType.Int).Value = Val(txtstock.Text) .Add("@cod", SqlDbType.Char).Value = txtcodigo.Text End With cmd.ExecuteNonQuery()

cmd = New SqlCommand("Update dbo.Kardex Set kar_stock = @st Where kar_codigo=@cod", cnk) With cmd.Parameters .Add("@st", SqlDbType.Int).Value = Val(txtstock.Text) .Add("@cod", SqlDbType.Char).Value = txtcodigo.Text End With cmd.ExecuteNonQuery()

tr.Complete() MessageBox.Show("Articulo Actualizado") Me.DGArticulos.DataSource = DataArticulos()

Catch ex As SqlException MessageBox.Show(ex.Message) Finally cn.Close() cnk.Close() End TryEnd Using

11.

12. Ejecute la Aplicacin y probar los procesos.

Autoevaluacin

1. Cul es la diferencia entre una transaccin local y una transaccin distribuida?____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

2. Defina los niveles de aislamiento (isolation level) de una transaccin.____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

3. Qu es una transaccin distribuida? explique acerca de TransactionScope____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

4. Explique brevemente cada uno de los valores de TransactoinScopeOption.______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

5. Desarrollo prctico: Implemente un programa donde realice la actualizacin de vendedores dentro de la base de datos BDFactura, donde en dicho proceso aplicar las transacciones locales

Para recordar

Las transacciones locales son tiles para las aplicaciones que desean utilizar la misma transaccin en varias llamadas a funciones o varias llamadas a subprocesos. Tiene que llamar de forma especfica a los mtodos Commit y RollBack para confirmar o anular la transaccin.

Las transacciones locales utilizan niveles de aislamiento o Isolation Level: ReadCommitted, ReadUnCommitted, Serializable, Chaos al momento de actualizar los datos.

En la capa de datos, tambin, se maneja transacciones donde se utilizan las siguientes sentencias:

BEGIN TRANSACTION COMMIT TRANSACTION ROLLBACK TRANSACTION

Las transacciones distribuidas estn definidas en el .NET FrameWork 2.0 con la clase TransactionScope.

La clase TransactionScope define un conjunto de valores segn el tipo de transaccin a realizar:

Required: crea una transaccin, si ya existe se agrega RequiresNew: siempre crea una nueva transaccin. Suppress: suprime una transaccin, donde las sentencias se ejecutan sin transacciones

Al crear una transaccin: TransactionScope se utiliza la sentencia Using y para actualizar los procesos se utiliza el mtodo Complete

Nota: Texto adaptado de la pgina web:http://msdn2.microsoft.com/es-es/library/z80z94hz(VS.80).aspxhttp://msdn2.microsoft.com/es-es/library/ms172152(VS.80).aspx