La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

TRANSACCIONES, AISLAMIENTO Y CANDADOS

Presentaciones similares


Presentación del tema: "TRANSACCIONES, AISLAMIENTO Y CANDADOS"— Transcripción de la presentación:

1 TRANSACCIONES, AISLAMIENTO Y CANDADOS
MAGIS Ltda Versión 2.1 TRANSACCIONES, AISLAMIENTO Y CANDADOS Bases de Datos Ingeniería de Sistemas Universidad Nacional de Colombia 2013 UML aplicado a análisis y diseño orientado a objetos

2 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

3 Operación sin control Saldo inicial del cliente A = 1000 Retira 800
retiro = 800 RETIRO Ingrese retiro Lea saldo del cliente A Si saldo >= retiro saldo = saldo – retiro grabe saldo suministre dinero Fin_SI saldo = 1000 saldo = 200

4 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 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 = 200 saldo = 300 saldo = 900 saldo = 1300

5 Operación con 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 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 Espere saldo = 200 Espere saldo = 200 Espere saldo = 100 saldo = 400

6 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

7 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

8 Cuándo usar transacciones?
Cuando un conjunto de sentencias se deben comportar como una unidad

9 Sentencias para transacciones
Cuatro sentencias definen la estructura de una transacción: begin tran commit tran rollback tran save

10 begin tran y commit tran
Inicia la transacción commit tran Finaliza la transacción Todas las modificaciones quedan en firme

11 begin tran y commit tran
Sintaxis: begin { tran | transaction } [ transaction_name ] commit [ tran | transaction | work ] [ transaction_name | savepoint_name ] Ejemplo: is a monetary amount to be transferred. is the account to be debited. is the account to be credited. begin tran update accounts set balance = balance where account set balance = balance where account commit tran

12 begin tran y commit tran
Sintaxis: begin { tran | transaction } [ transaction_name ] commit [ tran | transaction | work ] [ transaction_name | savepoint_name ]

13 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

14 Sintaxis para rollback tran
rollback [ tran [ transaction_name | savepoint_name ] | transaction [ transaction_name | savepoint_name ] | work [ transaction_name | savepoint_name ] ]

15 Ejemplo para rollback tran
-- is below 0, abort the transfer begin tran update accounts set balance = balance where account set balance = balance where account if (select balance from accounts where account < 0 rollback tran else commit tran

16 Ejemplo con rollback tran
-- When transferring money from savings to -- checking, the balance in savings must -- decrease and the balance in checking must -- increase by the same amount. Both actions -- must occur or else the transaction will fail. begin transaction /* take money out of savings account */ update accounts set balance = balance - $ where acct_num = "83165-S" if <> 0 or <> 1 begin The update failed. Either there -- was a rule violation, unexpected error, -- no accounts were affected, or more than -- one account was affected rollback tran return -- ends execution of transaction end

17 /* put money into checking account */
update accounts set balance = balance + $ where acct_num = "83165-C" if <> 0 or <> 1 begin The update failed. Either there -- was a rule violation, unexpected error, -- no accounts were affected, or more than -- one account was affected rollback tran return -- ends execution of transaction end commit transaction select acct_num, balance from accounts where acct_num like "83165-[SC]"

18 Ejemplo con begin tran, commit tran, rollback tran
Crear una tabla: select * into mytitles from pubs2..titles Iniciar una transacción: begin tran Borrar todas las filas de la tabla: delete from mytitles select * from mytitles Deshacer el borrado: rollback tran

19 Borrar todas las filas de la tabla: Dejar en firme el borrado:
delete from mytitles select * from mytitles Dejar en firme el borrado: commit tran Borrar los objetos de base de datos creados: drop table mytitles

20 save save crea un nombre de un punto de grabación
Es una extensión SQL que permite rollbacks parciales

21 Sintaxis para save Sintaxis:
save { transaction | tran } savepoint_name

22 Ejemplo para save Ejemplo:
-- The rollback rolls back to point1. This undoes -- the delete of business books, but not the -- delete of mod_cook books. Execution resumes -- with the statement after the rollback, which -- deletes popular_comp books. begin tran delete from titles where type = "mod_cook" save tran point1 delete from titles where type = "business" rollback tran point1 delete from titles where type = "popular_comp" commit tran

23 Ejemplo con savepoint -- This bank charges a fee for every use of an ATM. -- If the funds cannot be deducted from savings, -- the fee for the ATM usage remains. However, if -- the funds cannot be added to checking, the usage -- fee for the ATM is waived. begin tran /* apply ATM usage fee */ update accounts set serv_chge = serv_chge + $1.50 where acct_num = "83165-S" save transaction charge /* deduct funds from savings */ set balance = balance - 100

24 if @@error <> 0 or @@rowcount <> 1
begin rollback transaction charge commit tran return end else update accounts /* add funds to checking */ set balance = balance + $100 where acct_num = "83165-C" rollback tran go

25 Ejemplo con savepoints
Crear una tabla: select * into mytitles from pubs2..titles Iniciar una transacción: begin tran Borrar datos de una tabla: delete from mytitles where type = "psychology" select * from mytitles Establecer un savepoint: save tran title_sav Borrar los restantes datos de la tabla:

26 Restaurar hasta el savepoint: Dejar en firme la transacción:
rollback tran title_sav select * from mytitles Dejar en firme la transacción: commit tran Borrar los objetos de base de datos creados: drop table mytitles

27 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

28 Rollbacks anidados Ejemplo: begin tran
delete from titles where type = "mod_cook" delete from titles where type = "business" delete from titles where type = "trad_cook" rollback tran -- Entire transaction rolled back commit tran -- This statement has no effect

29 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.

30 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

31 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

32 Ejemplo de modo Unchained
set chained off begin tran delete salesdetail where stor_id = "5023" and ord_num = "AB-123-DEF-425-1Z3" if <> begin rollback tran return end delete sales where stor_id = "5023" and ord_num = "AB-123-DEF-425-1Z3" if <> 0 begin rollback tran return end commit tran

33 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

34 Ejemplo de modo chained
set chained on -- The server executes an implicit begin tran before -- the next statement. delete salesdetail where stor_id = "5023" and ord_num = "AB-123-DEF-425-1Z3" if <> begin rollback tran return end delete sales where stor_id = "5023" and ord_num = "AB-123-DEF-425-1Z3" if <> 0 begin rollback tran return end commit tran

35 Ejemplo begin tran insert sales values
("5023", "AB-123-DEF-425-1Z3", "Oct ") if <> 0 begin rollback transaction return end insert salesdetail values ("5023", "AB-123-DEF-425-1Z3", "TC4203", 2500, 60.5) commit transaction

36 Ejemplo begin tran update publishers set pub_id = "9999" where pub_id = "9988" /* check for system error or no rows affected */ if <> 0 or <> 1 begin rollback tran /* Rollback to begin tran*/ return end

37 Ejemplo update titles set pub_id = "9999" -- cascade change to titles where pub_id = "9988" if <> 0 begin rollback tran /* Rollback both updates*/ return end /* You might not check for the ** update to the titles table because a publisher ** may not have any titles associated with it. ** A message sent by a print or raiserror ** statement may be used to advise the user that ** no rows were modified in titles. */ commit tran

38 Ejemplo Batch que contiene transacción: declare @err int, @rows int
begin tran update publishers set pub_id = "x999" where pub_id = "0736" = <> 0 begin rollback tran raiserror 31001, "0736" return end = begin rollback tran raiserror 35001, "publishers" return end

39 Ejemplo update titles -- cascade change to titles set pub_id = "x999" where pub_id = "0736" = <> 0 begin rollback tran raiserror 31002, "0736" return end commit tran

40 Necesidad de aislamiento
En ambientes multiusuario, las transacciones acceden a los datos simultáneamente Datos que no estén aislados pueden estar errados

41 Bloqueo (locking) Mecanismo automático que aisla los datos para prevenir conflictos de los datos que se están modificando

42 Estructura interna de una tabla

43 Alcance de los candados
El alcance de un candado determina cuántos datos se aislan Tres alcances

44 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

45 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)

46 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)

47 Candados shared y exclusive
Nota: Se intenta involucrar dos tablas: un select para publishers y un delete para authors Nota: Se usa la opción holdlock, la cual asegura que los candados shared no se liberan hasta cuando concluya la transacción. El instructor tipea: begin tran select * from pubs2..publishers holdlock delete from pubs2..authors Espera para ver los datos de publishers:

48 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

49 Resúmen de tipos de candados
*Updates y deletes usan candados exclusive solamente para encontrar los datos que necesitan modificar

50 Deadlock

51 Resolución del deadlock

52 Esquema de bloqueo Esquema de bloqueo es un atributo de la tabla que determina qué datos asociados con la tabla están bloqueados

53 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

54 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

55 Bloqueo “datarows” Las páginas de índices nunca se bloquean
El servidor usa candados de tabla, candados de página y candados de fila

56 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

57 Fijar el esquema bloqueo
Ejemplo: create table publishers ( pub_id char(4) NOT NULL, pub_name varchar(40) NULL, city varchar(20) NULL, state char(2) NULL) lock datarows

58 Cambiar el esquema de bloqueo
Sintaxis simplificada: alter table table_name lock { allpages | datapages | datarows } Ejemplo: alter table publishers lock datapages

59 Cambiar el esquema de bloqueo
Sintaxis simplificada: alter table table_name lock { allpages | datapages | datarows }

60 Ver esquema de bloqueo Ver el default del esquema de bloqueo actual:
sp_configure "lock scheme" Ver el esquema de bloqueo de una tabla: exec sp_help nombre_tabla

61 Ejemplo Ver el default del esquema de bloqueo actual:
sp_configure "lock scheme" Crear una tabla con el esquema default de bloqueo: create table def_scheme ( a int ) Crear una tabla con un esquema de bloqueo especifico: create table dpl_scheme ( a int ) lock datapages Ver el esquema de bloqueo ambas tablas: exec sp_help def_scheme exec sp_help dpl_scheme

62 Ejemplo Cambiar el esquema de bloqueo de la primera tabla:
alter table def_scheme lock datarows Ver el esquema de bloqueo ambas tablas: exec sp_help def_scheme exec sp_help dpl_scheme Borrar los objetos de base de datos creados: drop table dpl_scheme drop table def_scheme

63 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

64 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”

65 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”

66 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”

67 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

68 Nivel 1 de aislamiento 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

69 Nivel 2 de aislamiento 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

70 Nivel 3 de aislamiento Nivel 3 – El nivel más restrictivo:
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

71 Nivel 0 de aislamiento Nivel 0 – El nivel menos restrictivo:
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

72 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

73 sp_procxmode sp_procxmode permite ver y cambiar el modo de transacción de un procedimiento Sintaxis: sp_procxmode [ procedure_name [ , {chained | unchained | anymode} ] ] Ejemplo: sp_procxmode proc_update_titles, unchained

74 sp_procxmode sp_procxmode permite ver y cambiar el modo de transacción de un procedimiento Sintaxis: sp_procxmode [ procedure_name [ , {chained | unchained | anymode} ] ]

75 Rótulos de modo de transacción
Fijar modo chained: set chained on Crear un procedimiento sencillo: create proc tagtest as print "Tag test" return Fijar modo unchained: set chained off Ejecutar el procedimiento: exec tagtest ¿Qué clase de error resulta?

76 Rótulos de modo de transacción
Cambiar el rótulo del modo de transacción: sp_procxmode tagtest, unchained Ejecutar el procedimiento: exec tagtest Borrar los objetos de base de datos creados: drop proc tagtest

77 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) begin tran <statements...> if <error> begin rollback tran return end exec proc2 commit tran return Proc2(Procedimiento anidado) begin tran <statements...> if <error> begin rollback tran return end commit tran return

78 Savepoints y Rollbacks anidados
Usar savepoints para evitar rollbacks no deseados proc 2 save tran xyz (3) <statements...> if <error> rollback tran xyz(4) else ... (3) save tran no incrementa el nivel de anidamiento. (4) rollback regresa al punto xyz. Entonces se ejecutan las subsiguientes sentencias en proc2. 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 -o- commit hace commit a todo. proc 1 save tran abc (2) <statements...> exec proc2 if <error> rollback tran abc (5) else ... (2) save tran no incrementa el nivel de anidamiento. (5) rollback regresa al punto abc. Entonces se ejecutan las subsiguientes sentencias en proc1.

79 Plantilla para llamado de procedimientos
create proc proc1 as int = = transaction has not begun begin transaction proc1_tran else transaction already initiated nesting level begins or -- continues save transaction proc1_tran -- processing goes here

80 Plantilla para llamado de procedimientos
if (something goes wrong, for example, <> 0) begin rollback tran proc1_tran return you determine error number end = proc2 -- Call procedure, begin nesting = Did called proc fail? begin to rollback or continue. rollback tran proc1_tran return -999 end = 0 -- this proc executed begin tran commit tran proc1_tran -- no need to commit with save tran return

81 Plantilla para llamado de procedimientos
create procedure proc2 as int = = 0 -- transaction has not begun begin transaction proc2_tran else -- transaction already initiated -- nesting level save transaction proc2_tran -- processing goes here

82 Plantilla para llamado de procedimientos
if (something goes wrong, for example, <> 0) begin rollback tran proc2_tran return you determine error number end more processing if required = this proc executed begin tran commit tran proc2_tran -- no need to commit with save -- tran return

83 Triggers y rollbacks Tres tipos de rollbacks: Deshacer el trigger
Deshacer el trigger y la sentencia que lo disparó Deshacer toda la transacción

84 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 Caso B begin tran (este caso insert ... ocasiona un print "in sp" error) commit tran print "sp done" begin tran s2 rollback tran s2

85 Deshacer un trigger rollback trigger deshace el trigger y la sentencia que lo disparó Sintaxis: rollback trigger [with raiserror error_number [error_statement] ] Ejemplo: create trigger trg_i_publishers on publishers for insert as if > 1 begin rollback trigger with raiserror 40031 "You cannot insert more than one publisher at a time." return end

86 Deshacer un trigger rollback trigger deshace el trigger y la sentencia que lo disparó Sintaxis: rollback trigger [with raiserror error_number [error_statement] ]

87 Procedimiento almacenado
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

88 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" Trigger begin tran ... rollback tran print "tr done” return Procedimiento Almacenado Caso E begin tran insert print "in sp" commit tran print "sp done" Trigger Rollback tran print “tr done” return

89 Triggers y rollbacks -- Book price can be updated if:
-- 1) only one title is updated at a time -- 2) the update occurs during the work week -- 3) the price changes by 10% or less -- 4) only books with sales > 0 are updated create trigger trg_u_titles on titles for update as int = = 0 return

90 Triggers y rollbacks -- 1) only one title at a time
> 1 begin rollback trigger with raiserror "Can only update or add one title at a time." return end -- 2) occurs during the work week if (select datepart(dw, getdate())) in (1, 7) begin rollback trigger with raiserror 20012 "Can only update price during work day." return end

91 Triggers y rollbacks -- 3) the price changes by 10% or less
if (select new.price/old.price from inserted new, deleted old) not between 1.10 and begin rollback trigger with raiserror 20013 "Can only change price by 10 percent." return end -- 4) only books with sales > 0 if (select isnull(total_sales, 0) from inserted) <= 0 begin rollback trigger with raiserror 20014 "Can only change price of book with sales." return end return go

92 Preguntas Gracias por su Atención
MAGIS Ltda Versión 2.1 No IEEE standard 829 standard test plan is required to have all this information, but the typical 829 template calls for it. Test cases are often described, in practice, in great detail. Why spend so much time on IEEE 829? Most test planning templates, including the example template given in RUP, are based on 829. Whether the student has heard the 829 name or not, most of the discussions he or she has read or heard about regarding what a test plan should contain, trace back to standard 829. Preguntas Gracias por su Atención UML aplicado a análisis y diseño orientado a objetos


Descargar ppt "TRANSACCIONES, AISLAMIENTO Y CANDADOS"

Presentaciones similares


Anuncios Google