TRANSACCIONES, AISLAMIENTO Y CANDADOS

Slides:



Advertisements
Presentaciones similares
Transacciones y Concurrencia en Oracle
Advertisements

VISTAS (VIEWS) DEFINICIÓN Y OBJETIVO DE LAS VISTAS.
Unidad 3.
Rocío Contreras Águila Primer Semestre 2010
Implementación de procedimientos almacenados
Implementación de procedimientos almacenados. Introducción a los procedimientos almacenados Creación, ejecución, modificación y eliminación de procedimientos.
Administración de transacciones y bloqueos
Modificación de datos.
Introducción a Transact-SQL
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo Introducción a PL/SQL Conceptos básicos.
Subprogramas: Procedimientos
Maestría en Bioinformática Bases de Datos y Sistemas de Información SQL: DML Ing. Alfonso Vicente, PMP
PL/SQL Francisco Moreno Universidad Nacional.
PL/SQL Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
UNITA - IBARRA BLOQUES PL-SQL SUBPROGRAMAS Paulina Guevara.
Cursores Implícitos y Explícitos
Diseño Físico Procedimientos Almacenados y Disparadores (Triggers)
4.3. Privilegios de usuarios
Editing Slides With Polaris Office, you can create new .ppt and .pptx presentations or edit your presentation with ease.
PL/SQL Francisco Moreno Universidad Nacional.
SQL SERVER APLICADO (SSA010) Ariel Alexis Fierro Sáez DuocUC.
Transacciones (MySQL). Definición: Conjunto de sentencias que se tratan como una sola. Comienzan con BEGIN/START TRANSACTION; Se puede confirmar (COMMIT)
CURSORES Preparó: Ismael Castañeda Fuentes Fuentes: Manuales Sybase
If anidados y Switch Prof. Lillian Bras.
1 BD Activas: Motivación zLos SGBD convencionales son “pasivos”. Sólo ejecutan preguntas o transacciones realizadas por los usuarios o por los programas.
PL/SQL Francisco Moreno Universidad Nacional. Introducción al PL/SQL ¿Por qué PL/SQL? A pesar de que SQL tiene mecanismos de control condicional (cláusula.
Bases de Datos Relacionales
Aislamiento Bloqueo.
16/04/ Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla.
PL/SQL Francisco Moreno Universidad Nacional.
Universidad del Cauca – FIET – Departamento de Sistemas
D Copyright © 2010, Oracle y/o sus filiales. Todos los derechos reservados. Uso de SQL*Plus.
PL/SQL Francisco Moreno Universidad Nacional.
Subconsultas Avanzadas
Ing. Ricardo Carlos Inquilla Quispe
Procedimientos Almacenados Funciones Agregadas
UNITA - IBARRA TRIGGERS
John Freddy Duitama M.U.de.A. Facultad de Ingeniería. Creación del esquema de Una Base de Datos. John Freddy Duitama Muñoz. Facultad de Ingeniería. U.de.A.
Bases de Datos Relacionales
PL/SQL Francisco Moreno Universidad Nacional.
TRIGGERS EN ORACLE 8 J. Iriarte S. España
Diseñando la arquitectura de aplicaciones empresariales. Acceso al SQL Server.- Autenticación de usuario:
Control de Transacciones.
Triggers(Disparadores)
TRANSACCIONES DISEÑO DE BASE DE DATOS.
LENGUAJE SQL.
John Freddy Duitama M.U.de.A. Facultad de Ingeniería. Creación del esquema de Una Base de Datos. John Freddy Duitama Muñoz. Facultad de Ingeniería. U.de.A.
ALC 155 miércoles el 25 de mayo. Bienvenida Sientense SS – lado a lado Uno lee las preguntas en voz alta la otra persona contesta.
CONSTRUCCIÓN DE BASES DE DATOS
SQL Sigla del nombre “Structured Query Language”.
Progressive. The progressive consist of two parts: a helping verb and the present participle of a main verb, which ends in –ing in English: is talking.
Comandos de SQL Prog. Orientada a Eventos. Inserción de datos (INSERT) INSERT….VALUES INSERT INTO Tabla1 (Columna1, Columna2…) VALUES (‘ValorAlfa’, ValorNum…);
MSSQL SERVER CURSO BÁSICO 1. DESCRIPCIÓN DEL CURSO. Sesión 4: Sentencia Insert,Transacciones,Insert general, Insert Select * From, Sentencia Update,Update.
DISPARADORES Y SISTEMAS DE GESTION DE BASE DE DATOS DE SQL
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo SQL en PL/SQL Conceptos básicos.
UNIVERSIDAD LATINA IV. CONSULTAS AVANZADAS CON BASES DE DATOS. E.I. L.E. Prof. Ramón Castro Liceaga.
Departamento de Lenguajes y Sistemas Informáticos escuela técnica superior de ingeniería informática Diseño de Bases de Datos Tema 4: Integridad.
Base de Datos I – Ing. Mary Carlota Bernal J. BASE DE DATOS I PL/SQL.
Sentencias DDL y DML PostgreSQL. Base de Datos I – Fundamentos Básicos PostgreSQL PostgreSQL es un servidor de base de datos relacional libre bajo la.
6 Triggers ORACLE - II Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
3 Cursores ORACLE Bases de datos II I-2014 Universidad del Cauca In. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca In. Wilson Ortega.
Base de Datos I – Ing. Mary Carlota Bernal J.  Cada instrucción PL/SQL tiene asociado internamente un cursor  Los cursores en PL/SQL pueden ser de dos.
DML Transact SQL Sesión X Triggers. Duración 2 Horas.
DML Transact SQL Sesión IX Introducción a los procedimientos almacenados.
DML Transact SQL Sesión VI Trabajando con subconsultas.
6 Triggers ORACLE Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
6 Triggers ORACLE - III Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
Crear una tabla (create table - sp_tables - sp_columns - drop table) Para ver las tablas existentes creadas por los usuarios en una base de datos usamos.
Base de Datos II 2da Parte. Propiedad ACID  La propiedad ACIDa es una carácterística de un DBMS para poder compartir datos en forma segura.  A :
Transcripción de la presentación:

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

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 = 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

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

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

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

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

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

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

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

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

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

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

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

Ejemplo para rollback tran -- If @from_account is below 0, abort the transfer begin tran update accounts set balance = balance - @amount where account = @from_account set balance = balance + @amount where account = @to_account if (select balance from accounts where account = @from_account) < 0 rollback tran else commit tran

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 - $1000 where acct_num = "83165-S" if @@error <> 0 or @@rowcount <> 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

/* put money into checking account */ update accounts set balance = balance + $1000 where acct_num = "83165-C" if @@error <> 0 or @@rowcount <> 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]"

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

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

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

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

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

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

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

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:

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

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

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

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.

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

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

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

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

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 @@error <> 0 begin rollback tran return end delete sales where stor_id = "5023" and ord_num = "AB-123-DEF-425-1Z3" if @@error <> 0 begin rollback tran return end commit tran

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

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

Ejemplo update titles set pub_id = "9999" -- cascade change to titles where pub_id = "9988" if @@error <> 0 begin rollback tran /* Rollback both updates*/ return end /* You might not check @@rowcount 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

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

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

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

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

Estructura interna de una tabla

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

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

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)

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)

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:

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

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

Deadlock

Resolución del deadlock

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

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

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

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

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

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

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

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

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

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

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

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

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”

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”

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”

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

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

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

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

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

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

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

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

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?

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

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

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.

Plantilla para llamado de procedimientos create proc proc1 as declare @ret_status int, @tran_flag int select @tran_flag = @@trancount if @tran_flag = 0 -- transaction has not begun begin transaction proc1_tran else -- transaction already initiated -- nesting level begins or -- continues save transaction proc1_tran -- processing goes here

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

Plantilla para llamado de procedimientos create procedure proc2 as declare @ret_status int, @tran_flag int select @tran_flag = @@trancount if @tran_flag = 0 -- transaction has not begun begin transaction proc2_tran else -- transaction already initiated -- nesting level save transaction proc2_tran -- processing goes here

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

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

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

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 @@rowcount > 1 begin rollback trigger with raiserror 40031 "You cannot insert more than one publisher at a time." return end

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

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

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

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 declare @num_rows int select @num_rows = @@rowcount if @num_rows = 0 return

Triggers y rollbacks -- 1) only one title at a time if @num_rows > 1 begin rollback trigger with raiserror 20011 "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

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 0.90 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

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