Upload
eduardocamdeca
View
222
Download
0
Embed Size (px)
Citation preview
7/25/2019 Que Es Una Transaccin en SQL
1/7
QUE ES UNA TRANSACCIN EN SQL?
Una transaccin es un conjunto secuencial de cambios a una base de datos. Las
transacciones se emplean como mecanismo de peticin para bases de datos de
multiusuarios (concurrencia).
Una transaccin es una unidad de trabajo compuesta por diversas tareas, cuyo
resultado final debe ser que se ejecuten todas o ninguna de ellas.
TRANSACCIONES IMPLCITAS Y EXPLICITAS
Para agrupar varias sentencias Transact !L en una "nica transaccin, disponemos
de los siguientes m#todos$
Transacciones e%pl&citas
'ada transaccin se inicia e%pl&citamente con la instruccin *+ T-'T+/ y
se termina e%pl&citamente con una instruccin '/00+T o -/LL'1.
Transacciones impl&citas
e inicia autom2ticamente una nueva transaccin cuando se ejecuta una instruccin
que reali3a modificaciones en los datos, pero cada transaccin se completa
e%pl&citamente con una instruccin '/00+T o -/LL'1.
CMO DEFINIR TRANSACCIONES
Por regla general en los gestores de datos relacionales modernos disponemos de tres
tipos de transacciones seg"n la forma de iniciarlas$
4e confirmacin autom2tica$ el gestor de datos inicia una transaccin
autom2ticamente por cada operacin que actualice datos. 4e este modo
mantiene siempre la consistencia de la base de datos, aunque puede generar
bloqueos. +mpl&citas$ cuando el gestor de datos comien3a una transaccin
autom2ticamente cada ve3 que se produce una actuali3acin de datos, pero el
que dic5a transaccin se confirme o se des5aga, lo debe indicar el
programador. %pl&citas$ son las que iniciamos nosotros 6a mano6 mediante instrucciones !.
somos nosotros, los programadores, los que indicamos qu# operacio7nes va aabarcar.
Una transaccin e%pl&cita se define de manera general con una instruccin que marca
su inicio, y dos posibles instrucciones que marcan su final en funcin de si debe tener
#%ito o debe fracasar en bloque.
Transacciones anidadas
Podemos anidar varias transacciones. 'uando anidamos varias transacciones la
instruccin '/00+T afectar2 a la "ltima transaccin abierta, pero -/LL'1 afectar2
a todas las transacciones abiertas.
7/25/2019 Que Es Una Transaccin en SQL
2/7
Un 5ec5o a tener en cuenta, es que, si 5acemos -/LL'1 de la transaccin
superior se des5aran tambi#n los cambios de todas las transacciones internas, aunque
5ayamos reali3ado '/00+T de ellas.
P!n"os de rec!#eracion $Sa%ePoin"&
Los puntos de recuperacin (avePoints) permiten manejar las transacciones por
pasos, pudiendo 5acer rollbac8s 5asta un punto marcado por el savepoint y no por
toda la transaccin.
Pro#iedades ACID
Una transaccin, para cumplir con su propsito y protegernos de todos los problemas
que 5emos visto, debe presentar las siguientes caracter&sticas$
tomicidad$ las operaciones que componen una transaccin deben
considerarse como una sola.
'onsistencia$ una operacin nunca deber2 dejar datos inconsistentes. islamiento$ los datos 6sucios6 deben estar aislados, y evitar que los usuarios
utilicen informacin que a"n no est2 confirmada o validada. (por ejemplo$
9sigue siendo v2lido el saldo mientras reali3o la operacin:) 4urabilidad$ una ve3 completada la transaccin los datos actuali3ados ya ser2n
permanentes y confirmados.
estas propiedades se las suele conocer como propiedades '+4 (de sus siglas en
ingl#s$ tomicity, 'onsistency, +solation y4urability).
CONTROL DE UNA TRANSACCIN
Para dirigir el flujo de una transaccin con efectividad y mantener sus propiedades,
e%isten las siguientes sentencias en !L. La sinta%is y etiqueta dependen de cada
gestor de bases de datos$
'/00+T $ guarda los cambios. -/LL'1$ des5ace los cambios. ;P/+T$ crea un punto de restauracin dentro de un conjunto de
transacciones para luego des5acer los cambios si es necesario.
TRANSACCIONES EN SQL SER'ER
n !L erver las instrucciones equivalentes a las gen#ricas que acabamos de ver
son$
*+ T-'T+/ o *+ T-$ marca el inicio de una transaccin.
T- es un sinnimo de T-'T+/ y se suele usar m2s a menudo por
abreviar. -/LL'1 T-T+/ o -/LL'1 T-$ fuer3a que se des5aga la
transaccin en caso de 5aber un problema o querer abandonarla. 'ierra la
transaccin. '/00+T T-'T+/ / '/00+T T-$ confirma el conjunto de
operaciones convirtiendo los datos en definitivos. 0arca el #%ito de la operacinde bloque y cierra la transaccin.
7/25/2019 Que Es Una Transaccin en SQL
3/7
Los ni%e(es de ais(a)ien"o *!e nos o+rece SQL Ser%er son,
-+L+
7/25/2019 Que Es Una Transaccin en SQL
4/7
* las cuentas de origen destino*/SET@importe !"#SET@CuentaOrigen !$2##%#######1$SET@CuentaDestino !$2##%#######2$/* Descontamos el importe de la cuenta origen */UPDATEC&'ASETA+DO !A+DO @importeWHERE&-C&'A !@CuentaOrigen/* .egistramos el moimiento */INSERTINTO-O0-'O(DC&'A,A+DOA'.O.,A+DO3O'.O.,-3O.',45-O0-'O)SELECTDC&'A,A+DO 6@importe,A+DO,@importe,getdate()FROMC&'AWHERE&-C&'A !@CuentaOrigen
/* ncrementamos el importe de la cuenta destino */UPDATEC&'ASETA+DO !A+DO 6@importeWHERE&-C&'A !@CuentaDestino/* .egistramos el moimiento */INSERTINTO-O0-'O(DC&'A,A+DOA'.O.,A+DO3O'.O.,-3O.',45-O0-'O)SELECTDC&'A,A+DO @importe,A+DO,@importe,getdate()FROMC&'AWHERE&-C&'A !@CuentaDestino
'sta forma de actuar seria erronea, a 7ue cada instruccin se e9ecutaria con:rmar;a de forma independiente, por lo 7ue un error de9ar;a los datos erroneosen la )
Transacciones implicitas e!plicitas
3ara actiardesactiar el modo de transacciones implicitas de
7/25/2019 Que Es Una Transaccin en SQL
5/7
'l siguiente e9emplo muestra el script anterior Baciendo uso de transaccionesexplicitas?
DECLARE@importe DECIMAL(18,2),@CuentaOrigen VARCHAR(12),@CuentaDestino VARCHAR(12)
/* Asignamos el importe de la transferencia* las cuentas de origen destino*/SET@importe !"#SET@CuentaOrigen !$2##%#######2$SET@CuentaDestino !$2##%#######1$#E$INTRANSACTION O solo ' .A#E$INTR%/* Descontamos el importe de la cuenta origen */UPDATEC&'ASETA+DO !A+DO @importe
WHERE&-C&'A !@CuentaOrigen/* .egistramos el moimiento */INSERTINTO-O0-'O(DC&'A,A+DOA'.O.,A+DO3O'.O.,-3O.',45-O0-'O)SELECTDC&'A,A+DO 6@importe,A+DO,@importe,getdate()FROMC&'AWHERE&-C&'A !@CuentaOrigen/* ncrementamos el importe de la cuenta destino */UPDATEC&'ASETA+DO !A+DO 6@importe
WHERE&-C&'A !@CuentaDestino/* .egistramos el moimiento */INSERTINTO-O0-'O(DC&'A,A+DOA'.O.,A+DO3O'.O.,-3O.',45-O0-'O)SELECTDC&'A,A+DO @importe,A+DO,@importe,getdate()FROMC&'AWHERE&-C&'A !@CuentaDestino/* Con:rmamos la transaccion*/COMMITTRANSACTION O solo CO--
ENDTR%#E$INCATCH/* Ea un error, desBacemos los cam$ENDCATCH
'l siguiente e9emplo muestra el mismo script con transacciones implicitas?
SETIMPLICIT"TRANSACTIONSON
7/25/2019 Que Es Una Transaccin en SQL
6/7
DECLARE@importe DECIMAL(18,2),@CuentaOrigen VARCHAR(12),@CuentaDestino VARCHAR(12)
/* Asignamos el importe de la transferencia* las cuentas de origen destino*/
SET@importe !"#SET@CuentaOrigen !$2##%#######2$SET@CuentaDestino !$2##%#######1$#E$INTR%/* Descontamos el importe de la cuenta origen */UPDATEC&'ASETA+DO !A+DO @importeWHERE&-C&'A !@CuentaOrigen/* .egistramos el moimiento */INSERTINTO-O0-'O(DC&'A,A+DOA'.O.,A+DO3O'.O.,-3O.',45-O0-'O)SELECTDC&'A,A+DO 6@importe,A+DO,@importe,getdate()FROMC&'AWHERE&-C&'A !@CuentaOrigen/* ncrementamos el importe de la cuenta destino */UPDATEC&'ASETA+DO !A+DO 6@importeWHERE&-C&'A !@CuentaDestino/* .egistramos el moimiento */INSERTINTO-O0-'O(DC&'A,A+DOA'.O.,A+DO3O'.O.,-3O.',45-O0-'O)SELECT
DC&'A,A+DO @importe,A+DO,@importe,getdate()FROMC&'AWHERE&-C&'A !@CuentaDestino/* Con:rmamos la transaccion*/COMMITTRANSACTION O solo CO--ENDTR%#E$INCATCH/* Ea un error, desBacemos los cam$ENDCATCH
+a transaccin sigue actia Basta 7ue emita unainstruccin COMMITo ROLL#AC&? &na eG 7ue la primera transaccin se Bacon:rmado o reertido, se inicia automticamente una nuea transaccin lasiguiente eG 7ue la coneHin e9ecuta una instruccion para modi:car datos?
+a coneHin continIa generando transacciones impl;citas Basta 7ue se desactiael modo de transacciones impl;citas?
3odemos eri:car el nImero de transacciones actias a tras de@@.ACO&?
SETIMPLICIT"TRANSACTIONSON
7/25/2019 Que Es Una Transaccin en SQL
7/7
#E$INTR%UPDATEC&'A SET45A+A !45A+A 1PRINT@@.ACO&COMMITENDTR%#E$INCATCH
ROLL#AC&PRINT$'rror$ENDCATCH
Transacciones ani'a'as(
#E$INTRANUPDATE'-3+'ADOSETO-.' !$De9oJer$WHERED!1#1#E$INTRAN
UPDATE'-3+'ADOSETA3'++DO1 !$De9oJer?CO-$WHERED!1#1 'ste CO-- solo afecta a la segunda transaccion?COMMIT
'ste .O++ACF afecta a las dos transacciones?ROLL#AC&
&na consideracin a tener en cuanta cuando tra