Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Normalmente los disparadores son utilizados para las acciones delete, insert y update, estos deben de
ser utilizados con cuidado si se utilizan otros comandos dml de actualización dentro del trigger ya que
puede darse una recursión de disparadores creando comportamientos no deseados.
END;
/
El disparador anterior se crea para el comando “insert”, cuando este se realiza en la tabla “TABLE1”.
Paquetes pl-sql
Los paquetes en PL/SQL tienen el objetivo de agrupar procedimientos y funciones de forma lógica. De
esta manera, se consigue agrupar en un único objeto, toda la casuística asociada a un determinado tipo
de tarea. Por ejemplo, si tenemos un conjunto de procedimientos y funciones para realizar cálculos
matemáticos complejos, los podemos poner en un paquete.
La ventaja de los paquetes es que la primera vez que se invoca, es cargado en memoria, por lo que las
siguientes veces ya no será necesario hacerlo de nuevo. Además, el paquete mantiene una copia en
memoria para todos los usuarios. Otra ventaja, es que podemos encapsular procedimientos y funciones
que no forman parte de la interfaz de usuario. Podemos ocultar ciertos objetos y solo hacer públicos los
que se necesiten. También se permite la sobrecarga dentro de los paquetes. El paquete se divide en
especificación y cuerpo.
La especificación nos muestra todos los procedimientos y funciones que van a ser públicos, también las
variables o contantes que van a ser globales y pueden ser accedidas fuera del paquete. La sintaxis de
creación de especificación es la siguiente:
Para el cuerpo del paquete, que contiene el código del paquete, define las funciones y procedimientos
públicos y privados. La sintaxis para el cuerpo del paquete es la siguiente:
1. La actualización perdida.
2. Dependencia no confirmada
3. El análisis inconsistente.
1. Actualización perdida
En este caso, ambas transacciones leen un dato y luego trabajan con el dato que ambas obtuvieron,
luego de realizar las operaciones necesarias ambas actualizan el dato, una después de la otra, por lo que
la segunda transacción, eliminará la actualización que realizó la primera transacción. Esto se puede ver
en la siguiente ilustración:
El análisis inconsistente
En este caso se dice que A ha visto un estado inconsistente y por lo tanto ha realizado un análisis
inconsistente, observe la figura y note que mientras la transacción A esta sumando cuentas, la
transacción B esta realizando una transferencia de la cuenta 3 a la 1, el resultado de A es obviamente
incorrecto. A diferencia del ejemplo anterior B ya ha confirmado sus actualizaciones antes de que A lea
la cuenta 3
1. Supongamos dos tipos de bloqueos: exclusivos (x) y compartidos (s) o bien bloqueos de escritura
y lectura respectivamente. (En este momento vamos a suponer que existen solo este tipo de
bloqueos aunque existen otros que veremos mas adelante en el curso)
2. Si una transacción coloca en una tupla un bloqueo X, se rechazara cualquier otro bloqueo de
otra transacción.
3. Si la transacción A coloca un bloqueo S en una tupla sucederá lo siguiente:
a. Se rechazara cualquier otro bloqueo X sobre la tupla de otra transacción.
b. Se aceptará cualquier bloqueo S sobre la tupla de otra transacción.
Estas reglas se resumen fácilmente por medio de la matriz de compatibilidad de tipos de bloqueo:
X S -
X No No Si
S No Si Si
- Si Si Si
Dados estos tipos de bloqueo y sus compatibilidades presentamos el “protocolo de acceso a datos” o
“protocolo de bloqueo” los cuales se utilizan para garantizar que no ocurra ninguno de los problemas de
concurrencia.
Implícitamente cada vez que se recupera una tupla se hace un bloqueo S, y cada vez que se hace una
actualización (update, delete, insert , estos con algunos pequeños cambios que no se incluyen por el
momento) se realiza un bloqueo X.
Actualización perdida:
En el siguiente caso ambas transacciones al inicio solicitan un bloqueo de tipo S, al entrar la transacción
A en el código de actualizar, se intenta un bloqueo X pero este no es compatible con el bloqueo S de la
transacción B asi que debe esperar a que B libere el bloqueo S. Por razón similar cuando la transacción
B intenta realizar un bloqueo X no es permitido por el bloqueo S de la transacción A.
El bloqueo por lo tanto resuelve el problema de la actualización perdida pero se da un nuevo problema
llamado bloqueo mortal (deadlock)
Dependencia no confirmada
En este caso el bloqueo se realiza al principio por la transacción B al actualizar t por medio de un
bloqueo X, cuando la transacción A intenta adquirir un bloqueo S, dado que no es compatible, debe de
esperar hasta que B libere los bloqueos de t. Mientras esto sucede la transacción A se encuentra en
espera, hasta que B realiza un commit/rollback que liberan los bloqueos de los objetos y A puede
continuar. El método soluciona el problema de la dependencia no confirmada.
Análisis inconsistente:
La solicitud de actualización(x) de B sobre ACC1 entra en conflicto con el bloqueo S que ya tiene A, y por
esto, B entra en un estado de espera, de igual forma la petición de leer de ACC3 en A no es aceptada
debido al bloqueo que ya tiene B debido a la segunda operación en ACC3.
Bloqueo Mortal:
El bloqueo mortal es una situación en la cual dos transacciones quedan en estados simultáneos de
espera, en la cual cada una de ellas se encuentra esperando que otra de las transacciones libere el
recurso que desea bloquear. Este tipo de bloqueo puede involucrar a dos o más transacciones.
Cuando esto ocurre el sistema normalmente lo detecta por medio del un ciclo en el “grafo de espera”.
Para eliminar el bloqueo mortal se debe seleccionar una de las transacciones del conflicto y deshacerla,
con lo cual liberara sus bloqueos y eliminará el bloqueo mortal. Algunas bases de datos no detectan
automáticamente los bloqueos mortales, sino tienen una cuota de tiempo, pasada la cual si la base de
datos no realiza una actividad o no finaliza alguna transacción se considera bloqueada mortalmente.
El enfoque de terminar una transacción al seleccionarla debe de ser realizado por el programador, dado
el criterio y punto de vista de este, siempre es preferible ocultar el problema ante el usuario final, por
razones obvias.