Transacciones en Bases de datos - Departamento de Ingeniería de

Anuncio
TRANSACCIONES, AISLAMIENTO Y
CANDADOS
Bases de Datos
Ingeniería de Sistemas
Universidad Nacional de Colombia
2013
Ejemplo de una cuenta corriente
RETIRO
Ingrese retiro
Lea saldo del cliente A
Si saldo >= retiro
saldo = saldo – retiro
grabe saldo
suministre dinero
Fin_SI
CONSIGNACION
Ingrese consignación
Lea saldo del cliente A
saldo = saldo +
consignación
grabe saldo
Operación sin control
Saldo inicial del cliente A = 1000
Retira 800
RETIRO
Ingrese retiro
Lea saldo del cliente A
Si saldo >= retiro
saldo = saldo – retiro
grabe saldo
suministre dinero
Fin_SI
retiro = 800
saldo = 1000
saldo = 200
Operación sin control
RETIRO
Ingrese retiro
Lea saldo del cliente A
Si saldo >= retiro
saldo = saldo – retiro
grabe saldo
suministre dinero
Fin_SI
CONSIGNACION
Ingrese consigna
Lea saldo del cliente A
saldo = saldo + consigna
grabe saldo
Saldo inicial del cliente A = 1000
Retira 800
Retira 700
Retira 100
Consigna 300
retiro = 800
retiro = 700
retiro = 100
consigna = 300
saldo = 1000
saldo = 1000
saldo = 1000
saldo = 1000
saldo = 200
saldo = 300
saldo = 900
saldo = 1300
Operación con control
RETIRO
Ingrese retiro
Lea saldo del cliente A
Si saldo >= retiro
saldo = saldo – retiro
grabe saldo
suministre dinero
Fin_SI
Retira 800
CONSIGNACION
Ingrese consigna
Lea saldo del cliente A
saldo = saldo + consigna
grabe saldo
Saldo inicial del cliente A = 1000
Retira 700
Retira 100
Consigna 300
retiro = 800
retiro = 700
retiro = 100
consigna = 300
saldo = 1000
Espere
Espere
Espere
saldo = 200
Espere
Espere
Espere
saldo = 200
saldo = 200
Espere
saldo = 100
saldo = 100
saldo = 400
Transacciones
Una transacción es una o más sentencias que se toman como
una unidad (todo termina bien o todo se aborta)
Una transacción es una unidad lógica de trabajo
Definida para las reglas del negocio
Típicamente incluye al menos una modificación de datos
Pasa la base de datos de un estado consistente a otro
Una transacción tiene dos posibles salidas:
Committed
Todas las modificaciones quedan en firme
Rolled back
Las modificaciones retornan a su estado inicial
Bases de Datos - 2013
Rol de las transacciones
Proteger los datos de las fallas del software, hardware, y
potencia eléctrica
Permitir el aislamiento de datos de tal forma que varios
usuarios pueden acceder simultáneamente a los datos sin
interferencia
Bases de Datos - 2013
Cuándo usar transacciones?
Cuando un conjunto de sentencias se deben comportar
como una unidad
Bases de Datos - 2013
Sentencias para transacciones
Cuatro sentencias definen la estructura de una
transacción:
begin tran
commit tran
rollback tran
save
Bases de Datos - 2013
begin tran y commit tran
begin tran
Inicia la transacción
commit tran
Finaliza la transacción
Todas las modificaciones quedan en firme
Bases de Datos - 2013
begin tran y commit tran
Sintaxis:
begin { tran | transaction } [ transaction_name ]
commit [ tran | transaction | work ] [ transaction_name
| savepoint_name ]
Bases de Datos - 2013
rollback tran
rollback tran termina una transacción
Deshace las modificaciones que se hayan hecho
La ejecución continua con la instrucción siguiente a
rollback
Bases de Datos - 2013
Sintaxis para rollback tran
Sintaxis:
rollback [ tran [ transaction_name | savepoint_name ] |
transaction [ transaction_name | savepoint_name ] |
work [ transaction_name | savepoint_name ] ]
Bases de Datos - 2013
save
save crea un nombre de un punto de grabación
Es una extensión SQL que permite rollbacks parciales
Bases de Datos - 2013
Sintaxis para save
Sintaxis:
save { transaction | tran } savepoint_name
Bases de Datos - 2013
Transacciones anidadas
Se pueden tener transacciones anidadas:
El begin y commit más externos comienzan y finalizan las transacciones
Las sentencias begin y commit internos solamente guardan un registro del
nivel de anidamiento
Bases de Datos - 2013
Transacciones y el log de transacciones
El registro de transacciones almacena los efectos de cada insert,
update y delete
El sistema utiliza el registro de transacciones para rehacer las
transacciones que se reversaron
Se registra el comienzo de una transacción, los commits y rollbacks
Si un servidor falla durante una transacción, no hay registro de un rollback o
commit
Durante la recuperación (recovery), las modificaciones en transacciones sin un
registro de rollback o commit no tendrán efecto. Si las modificaciones fueron
grabadas en disco, se revertirán.
Bases de Datos - 2013
Modo de transacción
Un modo de transacción especifica cómo el servidor
debe definir las transacciones
Dos modos de transacción
Unchained
Chained
Bases de Datos - 2013
Modo unchained
En modo unchained, se requiere explícitamente de una sentencia
begin tran
También se requiere de commit tran o rollback tran explícitos
Sintaxis:
Set chained off
Bases de Datos - 2013
Modo chained
En modo chained, el servidor ejecuta un begin implícito antes de:
Sentencias DML– insert, update, delete, select
Sentencias de Cursor– open, fetch
Se requiere de commit tran o rollback tran explícitos
Este modo es ANSI compliant
Sintaxis:
Set chained on
Bases de Datos - 2013
Necesidad de aislamiento
En ambientes
multiusuario, las
transacciones acceden
a los datos
simultáneamente
Datos que no estén
aislados pueden estar
errados
Bases de Datos - 2013
Bloqueo (locking)
Mecanismo automático
que aisla los datos para
prevenir conflictos de los
datos que se están
modificando
Bases de Datos - 2013
Estructura interna de una tabla
Bases de Datos - 2013
Alcance de los candados
El alcance de un candado determina cuántos datos se aislan
Tres alcances
Bases de Datos - 2013
Tipos de candados
El tipo de candado determina la extensión del aislamiento de
datos de otras transacciones
Tres tipos de candados
Shared
Exclusive
Update
Bases de Datos - 2013
Candados Shared
Usado por sentencias que leen datos (selects)
Otros procesos pueden leer los datos (coloca candado shared), pero
ningún proceso puede cambiar los datos (coloca candado exclusive)
Bases de Datos - 2013
Candados exclusive
Usado por sentencias que cambian datos (inserts, updates, deletes)
Ningún otro proceso puede leer los datos (coloca candado shared) o
cambiar los datos (coloca candado exclusive sobre la página)
Bases de Datos - 2013
Candados update
Usado por operaciones que pueden o no cambiar los datos (updates,
deletes)
Cuando el proceso primero escanea los datos, le aplica un candado update.
Otros procesos pueden colocar candados shared, pero ningún proceso
puede colocar candados exclusive o update
Bases de Datos - 2013
Resúmen de tipos de candados
Statements
That Impose
This Lock
If Data
Already
Has an S
Lock
Place
another S
lock
Wait for lock
to be
released
If Data
Already
Has an X
Lock
Wait for
lock to be
released
Wait for
lock to be
released
If Data
Already
Has a U
Lock
Place
another S
lock
Wait for
lock to be
released
Scopes for
Which This
Lock
Exists
Row, page,
table
Wait for
lock to be
released
Wait for
lock to be
released
Page
Shared
(S)
select
Exclusive
(X)
insert,
update*,
delete*
Update
(U)
update, delete Place the U
lock
Row, page,
table
*Updates y deletes usan candados exclusive solamente para encontrar
los datos que necesitan modificar
Bases de Datos - 2013
Deadlock
Bases de Datos - 2013
Resolución del deadlock
Bases de Datos - 2013
Esquema de bloqueo
Esquema de bloqueo es un atributo de la tabla que
determina qué datos asociados con la tabla están
bloqueados
Bases de Datos - 2013
bloqueo “allpages”
Se pueden bloquear las páginas de índices
El servidor usa candados de tabla y candados de página, pero no
candados de fila
Bases de Datos - 2013
Bloqueo “datapages”
Las páginas de índices nunca se bloquean
El servidor usa candados de tabla y candados de página, pero no
candados de fila
Bases de Datos - 2013
Bloqueo “datarows”
Las páginas de índices nunca se bloquean
El servidor usa candados de tabla, candados de página y candados
de fila
Bases de Datos - 2013
Fijar el esquema bloqueo
Sintaxis simplificada:
create table table_name (
column_name
datatype [ NULL | NOT NULL | IDENTITY ] ,
...
column_name
datatype [ NULL | NOT NULL | IDENTITY ] )
[ lock { allpages | datapages | datarows } ]
Si no se especifica un esquema de bloqueo, la tabla usa el esquema
default de bloqueo
Bases de Datos - 2013
Cambiar el esquema de bloqueo
Sintaxis simplificada:
alter table table_name
lock { allpages | datapages |
datarows }
Bases de Datos - 2013
Leer datos no aislados
Hay tres tipos de consultas o “reads”, que pueden retornar datos
que son inadecuados para limitar el aislamiento de datos
Las características de cómo se hacen estos “reads” son propios de
cada DBMS
Hay tres tipo de “reads”:
Dirty reads
Nonrepeatable reads
Phantom reads
Bases de Datos - 2013
Lectura sucia
La transacción 1 modifica datos
La transacción 2 lee los datos modificados antes de que la
modificación haya terminado
Esta transacción lee datos “uncommitted” o “dirty”
Bases de Datos - 2013
Lectura no repetible
La transacción 1 lee datos
La transacción 2 modifica esos datos antes de que la primera
transacción haya terminado
La primera lectura es ahora “nonrepeatable”
Bases de Datos - 2013
Lectura fantasma
La transacción 1 lee un conjunto de filas que cumplen una condición
La transacción 2 modifica los datos de algunas columnas que no
cumplían esa condición y ahora la cumplen, o al contrario
Las filas que aparecen y desaparecen se denominan “phantoms”
Bases de Datos - 2013
Nivel de aislamiento
Un nivel de aislamiento es un conjunto de candados que permiten o
no una combinación particular de los tres tipos de lectura: sucia, no
repetible o con fantasmas
ANSI define cuatro niveles de aislamiento, cada uno más restrictivo
que el anterior
Dirty Reads
Nonrepeatable
Reads
Phantom
Reads
Level 0
Allowed
Allowed
Allowed
Level 1
Prevented
Allowed
Allowed
Level 2
Prevented
Prevented
Allowed
Level 3
Prevented
Prevented
Prevented
Bases de Datos - 2013
Nivel 1 de aislamiento
Dirty reads
Nonrepeatable reads
Phantom reads
prevented
allowed
allowed
Nivel 1 - Comportamiento de select:
Se fijan candados Shared hasta que el select termine la lectura
de una fila o página
select espera a que se liberen los candados exclusive
Bases de Datos - 2013
Nivel 2 de aislamiento
Dirty reads
Nonrepeatable reads
Phantom reads
prevented
prevented
allowed
Nivel 2 - Comportamiento de select:
Se fijan candados Shared hasta que termine la transacción
Este comportamiento es diferente al del nivel 1
select espera a que se liberen los candados exclusive
Comportamiento discreto de nivel 2 requiere bloqueo “row-level”
Tables APL (All Pages Lock ) y tables DPL (Data Pages Lock) no tienen bloqueo
“row-level”
Si una consulta con nivel de aislamiento 2 lee una tabla APL o DPL, se forza
comportamiento de aislamiento nivel 3
Bases de Datos - 2013
Nivel 3 de aislamiento
Nivel 3 – El nivel más restrictivo:
Dirty reads
prevented
Nonrepeatable reads
prevented
Phantom reads
prevented
Nivel 3 - Comportamiento de select:
Se fijan candados shared hasta que termine la transacción
Este comportamiento es diferente al del nivel 1
select espera a que se liberen los candados exclusive
Bases de Datos - 2013
Nivel 0 de aislamiento
Nivel 0 – El nivel menos restrictivo:
Dirty reads
Nonrepeatable reads
Phantom reads
allowed
allowed
allowed
Nivel 0 - Comportamiento de select:
Se fijan candados Shared hasta que select termine la lectura
de una fila o página
select ignora los candados exclusive
Este comportamiento es diferente al del nivel 1
Bases de Datos - 2013
Rótulos de modo de transacción
Los procedimientos almacenados se rotulan con el modo de
transacción con el cual fueron creados
No se puede ejecutar una transacción en un modo diferente al del rótulo
Bases de Datos - 2013
sp_procxmode
sp_procxmode permite ver y cambiar el modo de transacción de un
procedimiento
Sintaxis:
sp_procxmode [ procedure_name [ , {chained | unchained | anymode} ] ]
Bases de Datos - 2013
Rollbacks no intencionales
• Un rollback no intencional es un rollback anidado que sin
intención deshace el trabajo en transacciones externas
Proc1(Transacción más externa)
Proc2(Procedimiento anidado)
begin tran
<statements...>
if <error>
begin
rollback tran
return
end
exec proc2
if <error>
begin
rollback tran
return
end
<statements...>
commit tran
return
begin tran
<statements...>
if <error>
begin
rollback tran
return
end
<statements...>
commit tran
return
Bases de Datos - 2013
Savepoints y Rollbacks anidados
• Usar savepoints para evitar rollbacks no deseados
batch (Tran más externa)
begin tran (1)
<statements...>
exec proc1
if <error>
rollback tran (6)
else commit tran
(1) Con begin tran inicia la
transacción. Nivel
anidamiento: 1.
(6) rollback deshace todas
las sentencias en proc1,
proc2, y batch
-ocommit hace commit a todo.
proc 1
proc 2
save tran abc (2)
<statements...>
exec proc2
if <error>
rollback tran abc (5)
else ...
save tran xyz (3)
<statements...>
(2) save tran no incrementa
el nivel de anidamiento.
(3) save tran no incrementa
el nivel de anidamiento.
(5) rollback regresa al punto
(4) rollback regresa al punto
xyz. Entonces se ejecutan
las subsiguientes sentencias
en proc2.
abc. Entonces se ejecutan las
subsiguientes sentencias en
proc1.
if <error>
rollback tran xyz(4)
else ...
Bases de Datos - 2013
Triggers y rollbacks
Tres tipos de rollbacks:
Deshacer el trigger
Deshacer el trigger y la sentencia que lo
disparó
Deshacer toda la transacción
Bases de Datos - 2013
Deshacer un trigger
Para deshacer un trigger, declarar un punto de grabación y luego
hacer el rollback
Un rollback sin punto de grabación deshace toda la transacción
Procedimiento almacenado
Caso A
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"
Trigger
save tran s1
....
rollback tran s1
print “tr done”
return
Procedimiento almacenado
Caso B
(este caso
ocasiona un
error)
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"
Trigger
begin tran s2
....
rollback tran s2
print “tr done”
return
Bases de Datos - 2013
Deshacer un trigger
rollback trigger deshace el trigger y la sentencia que lo
disparó
Sintaxis:
rollback trigger [with raiserror error_number
[error_statement] ]
Bases de Datos - 2013
Deshacer un trigger
Procedimiento
almacenado
Caso C
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"
Trigger
....
....
rollback trigger
print “tr done”
return
Bases de Datos - 2013
Deshacer una transacción
• Para deshacer toda la transacción donde está inmerso el trigger,
ejecutar un rollback sin un punto de grabación
Procedimiento almacenado
Caso D
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"
Procedimiento Almacenado
Caso E
begin tran
...
insert ...
print "in sp"
...
commit tran
print "sp done"
Trigger
begin tran
...
rollback tran
print "tr done”
return
Trigger
....
....
Rollback tran
print “tr done”
return
Bases de Datos - 2013
Preguntas
Gracias por su Atención
Bases de Datos - 2013
Descargar