jueves, 20 de mayo de 2010

Save Transaction

Hablemos un poco de transacciones, lo ideal es que nuestras peticiones a la Base de Datos sean ACID, que quiere decir Atómicas, Consistente, Aisladas y durables, siempre que una serie de instrucciones a la Base de datos cumple con estas características se denomina transacción.
ACID : (Atómicas)Lo que quiere decir es que nuestras peticiones sean ejecutadas como un solo bloque en el que se ejecuta todo o nada ,(Consistente) en el que se garantice que la integridad de nuestra base de datos no es alterada ,(Aisladas) que nuestras peticiones estén aisladas u ofrezcan un tipo de aislamiento que nos garantice que otras peticiones sobre los mismos datos no afecten las nuestras y que una vez que se ejecutaron los datos persistan y no se pierdan (durable).
El tema de las transacciones realmente es muy amplio, en este post únicamente pretendo abordar un escenario específico que son los puntos de retorno en una transacción.
En nuestra vida profesional nos puede tocar enfrentarnos a escenarios en los cuales tengamos algún proceso de SQL que requiera que podamos hacer un Rollback parcial. En otras palabras es posible con esto establecer puntos de retorno para nosotros en donde podamos deshacer solo parte de nuestra transacciòn.
Para poder crear puntos de retorno lo hacemos mediante la instrucciòn Save Transation [NOMBRE TRANSACTION] , en nuestro codigo podemos tener tantos como querramos y cuando necesitemos regresar a un punto en especifico lo que se ejecuta es RollBack Transaction [NOMBRE TRANSACTION].

Para dejar atrás la teoría necesitaremos crear una tabla que utilizaremos en nuestro ejemplo.
--Creamos la tabla que usaremos
If Not exists(Select * from sys.Objects where name='Tbl_Clientes'
and Type='U')
Create Table dbo.Tbl_Clientes
(
ClienteId Int Identity(1,1) Primary Key
,Nombre varchar(30) Not null
,[Fecha Registro] DateTime Not null Default Getdate()
)

GO

--
Begin Transaction
Insert into dbo.Tbl_Clientes(Nombre)
Values('Julio Rodriguez');
Insert into dbo.Tbl_Clientes(Nombre)
Values('Oscar Rodriguez');
Insert into dbo.Tbl_Clientes(Nombre)
Values('Lourdes Rodriguez');


Save Transaction PrimerBloque
Select ClienteId,Nombre,[Fecha REgistro] from dbo.Tbl_Clientes

Insert into dbo.Tbl_Clientes(Nombre)
Values('Omar Ramirez');
Insert into dbo.Tbl_Clientes(Nombre)
Values('Mario Ramirez');
Insert into dbo.Tbl_Clientes(Nombre)
Values('Fernando Ramirez');

Save Transaction SegundoBloque
Select ClienteId,Nombre,[Fecha REgistro] from dbo.Tbl_Clientes


Insert into dbo.Tbl_Clientes(Nombre)
Values('Dante Romero');
Insert into dbo.Tbl_Clientes(Nombre)
Values('Ignacio Romero');

Save Transaction TercerBloque
Select ClienteId,Nombre,[Fecha REgistro] from dbo.Tbl_Clientes


Rollback Transaction SegundoBloque
Select ClienteId,Nombre,[Fecha REgistro] from dbo.Tbl_Clientes


Commit Transaction;
GO
El punto a ejemplificar es que las posibilidades de lo que podemos hacer con esto ,pues estan en nuestras manos, nosotros podemos condicionar que bajo algun tipo de error o logica efectuemos un commit de nuestra transaccion y podamos hacer a un lado algo que se ejecuto pero que al final no nos interesa.
Espero les sea de utilidad

No hay comentarios:

Publicar un comentario