Triggers, stored procedure, transacciones y concurrencias en SQL

SQL

Disparadores

También conocidos como TRIGGERS, es un bloque de código almacenado en base de datos que se activa cuando se pulsa una determinada tecla u ocurre un determinado evento automáticamente, un disparador está asociado a una tabla como puede ser:

  • Realizar una consulta
  • Validar un dato
  • Hacer una operación DML inserta, modificar o eliminar registros de una base de datos.

En definitiva, los disparadores son eventos a nivel de tabla que se ejecutan automáticamente cuando se realizan ciertas operaciones sobre la tabla.

Existen varios tipos de disparadores, dependiendo del tipo de transacción de disparo y el nivel en el que se ejecuta el disparador:

  1. Disparadores de nivel de fila

    Se ejecutan una vez para cada fila afectada por una instrucción DML. Los disparadores de nivel de fila se crean utilizando la cláusula For Each Row en el comando create trigger.

  1. Disparadores de nivel de Instrucción

    Se ejecutan una vez para cada instrucción DML. Por ejemplo, si una única instrucción INSERT inserta 500 filas en una tabla solo se ejecutara una vez. Los disparadores de nivel de instrucción son el tipo predeterminado que se crea con el comando create trigger.

  1. Disparadores Before y After

    Puesto que son los disparadores son ejecutados por sucesos, puede establecerse que se produzcan inmediatamente antes (before) o después (after) de dichos sucesos.

  1. Disparadores Instead Of

    Puede utilizar INSTEAD OF para indicar a Oracle lo que tiene que hacer en lugar de realizar las acciones que invoca el disparador. Por ejemplo, podría usar un disparador INSTEAD OF en una vista para gestionar las inserciones en una tabla o para actualizar múltiples tablas que son parte de una vista.

  1. Disparadores de esquema

    Puede crear disparadores sobre operaciones en el nivel de esquema tales como create table, alter table, drop table, audit, rename, trúncate y revoke. Puede incluso crear disparadores para impedir que los usuarios eliminen sus propias tablas.

  1. Disparadores en nivel de base de datos

    Puede crear disparadores que se activen al producirse sucesos de la base de datos, incluyendo errores, inicios de sesión, conexiones y desconexiones. Puede utilizar este tipo de disparador para automatizar el mantenimiento de la base de datos o las acciones de auditoria.

Sintaxis de un disparador DML en SQL server.

CREATE TRIGGER

ON

AFTER INSERT, DELETE, UPDATE>
AS

BEGIN

— Código SQL que se desea ejecutar a la hora de que el disparador se

—– ejecute

END

Procedimientos almacenados

Un procedimiento es un conjunto de sentencias de SQL y que se guarda en la base de datos. Con los procedimientos se amplía la velocidad de ejecución de las consultas sin reducir la eficiencia en la respuesta del servidor de base de datos.

Esto porque el procedimiento es compilado en memoria virtual del cliente. En los procedimientos se pueden crear tablas temporales que solamente existían durante la ejecución del mismo.

Los valores resultantes de la ejecución del procedimiento serán obtenidos de la última consulta especificada, siempre y cuando no se envíen a una tabla temporal.

Se define una tabla temporal al anteponer el símbolo «#» a su nombre.

Crear un procedimiento

  • Crea un procedimiento almacenado, que es una colección guardada de instrucciones Transact-SQL que puede tomar y devolver los parámetros proporcionados por el usuario.
  • Los procedimientos se pueden crear para uso permanente o para uso temporal en una sesión (procedimiento local temporal) o para su uso temporal en todas las sesiones (procedimiento temporal global).
  • Sintaxis:

CREATE PROCEDURE
procedure_name [;number]

[{@parameter
data_type}

] go

Procedure_name

  • Es el nombre del Nuevo procedimiento almacenado. Los nombres de procedimientos y deben ser únicos en la base de datos y para su propietario.
  • Los procedimientos temporales locales o globales se pueden crear precediendo el procedure_name con un signo numérico simple (#procedure_name) para los procedimientos temporales locales y un signo numérico doble (##procedure_name) para los procedimientos temporales globales.

Eliminar y ejecutar un procedimiento

  • Sintaxis para eliminar: drop procedure nombre del procedimiento
  • Sintaxis para ejecutar: nombre del procedimiento parámetro 1, parámetro 2, parámetro n.
  • Ejecutar el procedimiento nombre del procedimiento.

Transaciones

Una transacción es una interacción con una estructura de datos compleja, compuesta por varios procesos que se han de aplicar uno después del otro. La transacción debe realizarse de una sola vez y sin que la estructura a medio manipular pueda ser alcanzada por el resto del sistema hasta que se hayan finalizado todos sus procesos. Una transacción en un Sistema de Gestión de Bases de Datos (SGBD), es un conjunto de órdenes que se ejecutan formando una unidad de trabajo, es decir, en forma indivisible o atómica.

Un SGBD se dice transaccional, si es capaz de mantener la integridad de los datos, haciendo que estas transacciones no puedan finalizar en un estado intermedio. Cuando por alguna causa el sistema debe cancelar la transacción, empieza a deshacer las órdenes ejecutadas hasta dejar la base de datos en su estado inicial (llamado punto de integridad), como si la orden de la transacción nunca se hubiese realizado.

Para esto, el lenguaje de consulta de datos SQL (Structured Query Language), provee los mecanismos para especificar que un conjunto de acciones debe constituir una transacción.

  • BEGIN TRAN:
    Especifica que va a empezar una transacción.
  • COMMIT TRAN:
    Le indica al motor que puede considerar la transacción completada con éxito.
  • ROLLBACK TRAN: Indica que se ha alcanzado un fallo y que debe restablecer la base al punto de integridad.

En un sistema ideal, las transacciones deberían garantizar todas las propiedades ACID; en la práctica, a veces alguna de estas propiedades se simplifica o debilita con vistas a obtener un mejor rendimiento.

Propiedades

Las transacciones deben cumplir cuatro propiedades ACID:

  1. Atomicidad (Atomicity): es la propiedad que asegura que la operación se ha realizado o no, y por lo tanto ante un fallo del sistema no puede quedar a medias.
  1. Consistencia (Consistency): es la propiedad que asegura que sólo se empieza aquello que se puede acabar. Por lo tanto, se ejecutan aquellas operaciones que no van a romper la reglas y directrices de integridad de la base de datos.
  1. Aislamiento (Isolation): es la propiedad que asegura que una operación no puede afectar a otras. Esto asegura que la realización de dos transacciones sobre la misma información nunca generará ningún tipo de error.
  1. Permanencia (Durability): es la propiedad que asegura que, una vez realizada la operación, ésta persistirá y no se podrá deshacer aunque falle el sistema.

La atomicidad frente a fallos se suele implementar con mecanismos de journaling, y la protección frente a accesos concurrentes mediante bloqueos en las estructuras afectadas. La serialibilidad viene garantizada por la atomicidad. La permanencia se suele implementar forzando a los periféricos encargados de almacenar los cambios a confirmar la completa y definitiva transmisión de los datos al medio (generalmente, el disco).

Concurrencia en base de datos

El termino concurrencia se refiere al hecho de que los DBMS (SISTEMAS DE ADMINISTRACION DEBD) permiten que muchas transacciones puedan accesar a una misma base de datos a la vez.

En un sistema de estos se necesitan algún tipo de mecanismos de control de concurrencia para asegurar que las transacciones concurrentes no interfieran entre sí. En sistemas multiusuario, es necesario un mecanismo para controlar la concurrencia. Se pueden producir inconsistencias importantes derivadas del acceso concurrente, como por ejemplo, el problema de la operación perdida.

Métodos de control de concurrencia

Protocolos basados en técnicas de bloqueo

Cabe destacar antes de comenzar el estudio de los protocolos basados en bloqueos que son los más utilizados por los SGBD comerciales. Los demás tienen un alcance más teórico que práctico. Un bloqueo es una variable asociada a un elemento de datos de la base de datos, usada para restringir las operaciones que se pueden aplicar sobre él. Existen varios tipos de bloqueo:

  • Binarios (de propiedades limitadas)
  • Compartidos,
  • Exclusivos (usados en la práctica),
  • De certificación.

Las operaciones sobre bloqueos se deben implementar como secciones críticas, es decir, de forma indivisible; el SGBD no deberá alternar sus instrucciones con otras.

Bloqueos Binarios

Se caracterizan por tener dos valores posibles, bloqueados y desbloqueados. Cada elemento de la base de datos tiene un bloqueo distinto. El bloqueo señala si una transacción está operando sobre el elemento o está libre para que se pueda operar con él. De esta manera se impide que dos o más transacciones estén operando sobre un mismo elemento al mismo tiempo. La implementación de un bloqueo binario es simple; basta con un vector de la siguiente forma: donde el booleano es en sí el indicador del bloqueo.

Bloqueos de lectura/escritura

Son una ampliación de los bloqueos binarios. Tenemos que el bloqueo puede tener tres posibles posiciones: libre, bloqueado para lectura, y bloqueado para escritura. De esta forma, más de una transacción puede tener un mismo elemento de datos bloqueado para lectura, pero sólo una para escritura. Si una transacción quiere escribir en ese elemento, habrá de esperar a que el bloqueo quede libre (cualquiera que sea el tipo de bloqueo), y a continuación, bloquearlo para escritura. Si quiere leer, sólo tendrá que esperar si el elemento está bloqueado para escritura. Se dice por tanto, que el bloqueo de lectura es compartido y el de escritura exclusivo. Tendremos por tanto tres operaciones:

  • bloquear_escritura(X)
  • bloquear_lectura(X)
  • desbloquear(X).

Problemas del bloqueo en dos fases: interbloqueo y espera indefinida. El interbloqueo se produce cuando cada transacción T en un conjunto de dos o más transacciones está esperando a algún elemento que está bloqueado por alguna otra transacción T’ de dicho conjunto. En este estado, cada transacción está parada en espera a que otra transacción libere el recurso. Las condiciones para que se produzca en interbloqueo son las siguientes:

  1. Exclusión mutua. Cada elemento está bloqueado por una transacción, o está libre.
  1. Retención y espera: Una transacción que ya tiene elementos bloqueados puede solicitar un elemento adicional, y esperar que se le asigne, sin devolver previamente ninguno de los anteriores.
  1. No apropiación: Sólo puede liberar un elemento la transacción que lo tiene asignado; no se lo puede quitar otra transacción que tenga mayor prioridad, ni el SGBD.
  1. Espera circular: Existe una cadena circular, compuesta por dos transacciones o más, y otros tantos elementos intercalados, de manera que cada proceso está esperando que se le asigne un elemento, el cual, a su vez, está asignado al siguiente proceso de la cadena.
  1. Bloqueo mutuo o de adlock: Un proceso se encuentra en estado de de adlock si esta esperando por un suceso que no ocurrirá nunca. Se puede producir en la comunicación de procesos y mas frecuentemente en la gestión de recursos.

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.