Académique Documents
Professionnel Documents
Culture Documents
TRANSACCIONALES
TEMA
OBJETIVOS ESPECFICOS
CONTENIDOS
ACTIVIDADES
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.
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
ReadCommitted
ReadUncommitted
Serializable
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".
DimcnAsNewSqlConnection("Server=(local)\SQLEXPRESS;
DataBase=BDFactura;integratedsecurity=true")
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.
Los objetos command se liberarn dentro del Using, luego cerrar la conexin
cn.Close()
Descripcin
BEGIN TRANSACTION
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
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
Descripcin
Required
RequiresNew
Supress
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
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()
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)
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")
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
a los
11.
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 distribuidas estn definidas en el .NET FrameWork 2.0 con la clase
TransactionScope.
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