Vous êtes sur la page 1sur 18

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.

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.

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

Chaos

Los cambios pendientes de las transacciones ms aisladas no se pueden


sobrescribir.

ReadCommitted

Los datos variables no se pueden leer durante la transaccin, pero se pueden


modificar.

ReadUncommitted

Se pueden leer datos variables y modificarse durante la transaccin.

Serializable

Se pueden leer datos variables pero no modificarse y no se pueden agregar


nuevos datos durante la transaccin.

Snapshot

Se 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

DimcnAsNewSqlConnection("Server=(local)\SQLEXPRESS;
DataBase=BDFactura;integratedsecurity=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 = True


cn.Open()
tr
Para
comando que se va a ejecutar dentro de
Dim
As cada
SqlTransaction
tr =Transaction
cn.BeginTransaction(IsolationLevel.Serializable)
para referir al objeto transaccin.

la transaccin, asignar la propiedad

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 If
End 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()

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
transacciones dentro de la capa de datos
Sentencia SQL

Descripcin

BEGIN TRANSACTION

Marca el inicio de una transaccin local.

que se utilizan para manejar

COMMIT
Marcar el fin de una transaccin completada con xito, y comitea o actualiza los
TRANSACTION
cambios efectuados despus del BEGIN TRANSACTION.
CREATE PROCEDURE dbo.UpdatePrecios
@codprod1 char(5),
ROLLBACK
el fin de una
transaccin
no completada
con xito,aypartir
cancela
IniciaMarca
la transaccin
donde
las actualizaciones
se agrupan
de todos
aqu los
@codprod2 char(5)
TRANSACTION
cambios efectuados despus del BEGIN TRANSACTION.
As
DECLARE @success BIT
Manejo
de una transaccin explcita en la capa de datos
Select @success=0

Crear un procedimiento almacenado

BEGIN TRANSACTION
En
el procedimiento
iniciar una transaccin
(BEGIN TRANSACTION)
Update
dbo.Articulos almacenado,
Set art_precio=art_precio
* 1.5
Colocar
las sentencias de actualizacin dentro de la transaccin
Where art_codigo=@codprod1
Si
todas
las operaciones
se ejecutaron correctamente, comitear la transaccin, pero si
if(@@error=0
AND @@rowcount=1)
Begin
operacin fall, deshacer los cambios a la transaccin
Update dbo.Articulos Set art_precio=art_precio * 2.0
Where art_codigo=@codprod2
siguiente
ejemplo muestra cmo
manejar
transaccin
en un por
procedimiento
Sentencia
deuna
actualizacin
de precios
un artculo almacenado.

la

El
El
procedimiento almacenado crea una transaccione y ejecuta dos sentencias de actualizacin dentro
de laif(@@error=0
transaccin. AND
Si se@@rowcount=1)
ejecut satisfactoriamente se aplicar Commit, si hubo al error se aplicar
Select @success=1
RollBack.

End
Si los procesos se ejecutan satisfactoriamente, se aplicar COMMIT, sino se aplicara ROLLBACK
If @success=1
COMMIT TRANSACTION
Else
ROLLBACK TRANSACTION

MANEJO DE TRANSACCIONES DISTRIBUIDAS


Las 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 TransactionScope
Using 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

Required

Hay 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

RequiresNew

La transaccin siempre crea una nueva transaccin.

Supress

Nunca participa en una transaccin, independientemente si hay una transaccin


presente. Por lo tanto, no existir ninguna transaccin.

Completar un mbito de transaccin


Cuando 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 transaccin
Si 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 Using
End 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 1
USO DE TRANSACCIONES LOCALES
En 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 2005
2. Seleccione en el men Files -> New ->Project
3. Elija las siguientes opciones de la ventana para crear un nuevo proyecto
a. En Project Types elija Visual Basic
b. En Templates elija WindowsApplication
c. En name coloque appFacturacion03
d. En Location coloque C:\CursoPOOII
4. Disee la siguiente interface

Objeto
Label1
Label2
Label3
Label4
Label5
Textbox1
Textbox2
Textbox3
Textbox4
Textbox5
Button1
Button2
Button3
Button4
Button5
DataGridView1

Name
Label1
Label2
Label3
Label4
Label5
Txtcodigo
Txtnombre
Txtdireccion
Txtfono
Txtruc
BtnLimpiar
BtnGrabar
BtnBuscar
BtnModificar
BtnEliminar
DGCliente

Propiedad
Valor
Text
Codigo
Text
Nombre
Text
Direccion
Text
Fono
Text
Ruc
5. Defina
los
Text
namespaces:
Text
System.Data.SqlClient
Text
y System.Transaction
Text
6.
Defina e inicializar la
Text
cadena de conexin a
Text
Limpiar
nivel Class Form
Text
Grabar
Text
Buscar
PrivatecnAsNewSqlConnection("Server=(local)\SQLEXPRESS;
Text
Modificar
DataBase=BDFactura;integratedsecurity=true")
Text
Eliminar

7. Defina

la

funcin

DataClientes que retorne los registros de los clientes


Function DataClientes() As DataTable
Dim da As New SqlDataAdapter("Select * from Clientes", cn)
Dim t As New DataTable
da.Fill(t)
Return t
End 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
Indica no se puede aadir registros
Me.DGCliente.AllowUserToAddRows = False
Me.DGCliente.DataSource = DataClientes()

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 CellClick
With DGCliente.CurrentRow
CurrentRow representa la fila actual
txtcodigo.Text = .Cells(0).Value
txtnombre.Text = .Cells(1).Value
txtfono.Text = .Cells(2).Value
CurrentRow se obtiene el valor de las columnas, el valor de la primera columa:
txtruc.Text = .Cells(3).Value
CurrentRow.Cells(0).Value
txtdireccion.Text = .Cells(4).Value
End With

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 conexin
b. Crear una transaccin, cuyo nivel de aislamiento es serializable
c. Dentro del Try crear un SqlCommand, aadir los parmetros
d. Ejecutar el comando con el mtodo ExecuteNonQuery
e. Si se proces correctamente, se ejecutar el mtodo Commit
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, 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 serializable
b. 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 conexin
b. 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, 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 ejercicio
15. Ejecutar la aplicacin y verificar los resultados

LABORATORIO 2
TRANSACCIONES DISTRIBUIDAS, TRANSACTIONSCOPE
En 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 kardex
La estructura de las tablas es la siguiente:
DATABASE BDFACTURA
CREATE TABLE ARTICULOS(
art_codigo char(5) primary key,
art_nombre varchar(30),
art_unidad char(4),
art_precio Decimal,
art_stock int)
DATABASE BDALMACEN
CREATE TABLE KARDEX(
kar_codigo char(5) primary key,
har_nombre varchar(30),
kar_unidad char(4),
kar_stock int)

1. Agregue un formulario al proyecto


2. Disee la siguiente interface.

Objeto
Label1
Label2
Label3
Label4
Label5
Textbox1
Textbox2
Textbox3
Textbox4
Textbox5
Button1
Button2
Button3
DataGridView1

Name
Label1
Label2
Label3
Label4
Label5
Txtcodigo
Txtdescripcion
Txtunidad
Txtprecio
Txtstock
BtnLimpiar
BtnGrabar
BtnActualizar
DGArticulos

Propiedad
Text
Text
Text
Text
Text
Text
Text
Text
Text
Text
Text
Text
Text

Valor
Codigo
Descripcin
Unidad
Precio
Stock

Limpiar
Grabar
Actualizar

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

PrivatecnAsNewSqlConnection("Server=(local)\SQLEXPRESS;
DataBase=BDFactura;integratedsecurity=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 t
End Function

6. En el evento Load del Form, llenar los datos en DGArticulos


Me.DGArticulos.DataSource = DataArticulos()

7. Programar el evento CellClick del DataGridView DGArticulos donde al seleccionar un registro se


visualice en los Textboxes
8. 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 BDAlmacen
b. Crear un transaccin Scope de tipo Required
c. Establecer la estructura Try Catch Finally para controlar las excepciones
d. Dentro del Try, definir un Command que ejecutar una sentencia de insercin a los
artculos.
e. Ejecutar el comando con el mtodo ExecuteNonQuery
f. 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
cn.Open()
MessageBox.Show(ex.Message)
cnk.Open()
Finally
Using
cn.Close()
tr As New
: TransactionScope()
cnk.Close()
Try
End Try
End Using
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
10. En End
botn
actualizar, actualizar el stock en artculo y en kardex:
With
cmd.ExecuteNonQuery()
a. Abrir la conexin y crear una conexin para BDAlmacen

b. Crear un transaccin Scope de tipo Required

cmd = New SqlCommand("Update dbo.Kardex Set


c. Establecer
la estructura
Try Catch Finally
kar_stock
= @st
Where kar_codigo=@cod",
cnk) para controlar las excepciones
d.
Dentro
del
Try,
definir
un
Command
que
ejecutar una sentencia de insercin
With cmd.Parameters
.Add("@st", SqlDbType.Int).Value = Val(txtstock.Text)
artculos.
.Add("@cod",
SqlDbType.Char).Value
= txtcodigo.Text
e. Ejecutar
el comando
con el mtodo ExecuteNonQuery
End With
f. En el Command, definir la sentencia de insercin al kardex.
cmd.ExecuteNonQuery()

g. Ejecutar el mtodo Complete de la transaccin.


h. Si el proceso tuvo un error, se desencadena el Catch.
tr.Complete()
MessageBox.Show("Articulo
Actualizado")
i. Al finalizar el proceso, se cerrar
las conexiones.
Me.DGArticulos.DataSource = DataArticulos()
Catch ex As SqlException
MessageBox.Show(ex.Message)
Finally
cn.Close()
cnk.Close()
End Try
End Using

a los

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:
o BEGIN TRANSACTION
o COMMIT TRANSACTION
o 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:


o Required: crea una transaccin, si ya existe se agrega
o RequiresNew: siempre crea una nueva transaccin.
o 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).aspx
http://msdn2.microsoft.com/es-es/library/ms172152(VS.80).aspx

Vous aimerez peut-être aussi