Académique Documents
Professionnel Documents
Culture Documents
Instructor
Sena
Bogotá
Octubre de 2019
INTRODUCCIÓN
Una transacción es una unidad de trabajo lógico y atómico que contiene una o más
declaraciones SQL.
Una transacción agrupa las sentencias de SQL para que estén todas confirmadas,
lo que significa que se aplican a la base de datos, o todas se retrotraen, lo que
significa que se deshacen de la base de datos. La base de datos Oracle asigna a
cada transacción un identificador único llamado ID de transacción.
Atomicidad
Consistencia
Aislamiento
Una instrucción SQL ejecutable es una instrucción SQL que genera llamadas a
una instancia de base de datos , incluidas las declaraciones DML y DDL y la SET
TRANSACTIONdeclaración.
Un usuario emite:
una declaración COMMITo sin una cláusula.ROLLBACKSAVEPOINT
Una vez que finaliza una transacción, la siguiente instrucción SQL ejecutable inicia
automáticamente la siguiente transacción. El siguiente ejemplo ejecuta
una UPDATE para iniciar una transacción, finaliza la transacción con
una ROLLBACK declaración y luego ejecuta una UPDATE para iniciar una nueva
transacción (tenga en cuenta que los ID de transacción son diferentes):
DETECTAR BLOQUEOS EN ORACLE
En Oracle hay una vista v$lock que nos indica los objetos que se encuentran en
bloqueo, el identificador de usuario y sesión y el tipo de bloqueo.
Un join con la tabla dba_objects nos proporciona además el nombre y tipo de los
objetos bloqueados:
ORA-00054: recurso ocupado y obtenido con NOWAIT especificado o
timeout vencido || Bloqueos
Este error suele aparecer cuando existen bloqueos esperando a que otro usuario
termine una operación, para poder realizar la suya. Uno de los más comunes que
suelen suceder es cuando se hacen “truncate” o “drop” de tablas y no nos deja
hacerlo porque las tabla/s están bloqueada/s por otros procesos de ese mismo u
otros usuarios.
Esto ocurre porque se ha bloqueado uno o varios registros mediante setencias SQL.
Select´s especificados como “NO WAIT” o “FOR UPDATE NOWAIT” o por una
operación DDL que fue bloqueada. La solución podía pasar por hacer el commit o
rollback. El commit no funcionó porque no hay espacio en el tablespace.
En Oracle hay una vista llamada v$lock que nos indica los objetos que se
encuentran en bloqueo, el identificador de usuario, sesion y el tipo de bloqueo. Un
join con la tabla dba_objects nos proporcionará además el nombre y tipo de los
objetos bloqueados. La consulta seria de la siguiente manera:
CONTROL DE CONCURRENCIA EN ORACLE
marcar una transacción y que ésta sólo acceda a la versión de los datos con un
SCN cercano al suyo, evitando así que las transacciones accedan a versiones
modificadas de las tablas.
Por defecto, Oracle activa los protocolos de concurrencia a nivel de sentencias, que
consisten en que una consulta utilice los valores que se encontraban en los registros
justo antes de comenzar la consulta (y no antes de comenzar la transacción). De
esta forma se evita que la consulta acceda a datos que no fueron confirmados
(Uncommited Data) o que están siendo actualizados por otras transacciones.
También se permite activar el control de concurrencia a nivel de transacciones, esto
se logra obligando a las consultas de una misma transacción a acceder a una sola
versión de los registros. Esto da como resultado que todas las consultas dentro de
una misma transacción utilicen la misma versión de los datos, generando
consistencia dentro de la transacción.
Como las transacciones son aisladas (según las propiedades ACID), Oracle posee
distintos niveles de aislamiento para asegurar la consistencia. Entre ellos se
encuentran:
Lectura Confirmada: Una consulta solo utiliza datos que fueron confirmados
(Commited Data) antes del comienzo de la ejecución de la consulta.
Serializable: Cada consulta utiliza los datos que fueron confirmados antes del
comienzo de la ejecución de la transacción, además de acceder también a los
cambios realizados por sentencias INSERT, DELETE, UPDATE que hayan sido
ejecutadas dentro de esta transacción.
Sólo Lectura: Sólo es visible la versión de los datos al momento del comienzo
de la transacción y no se permiten sentencias INSERT, UPDATE, DELETE,
dentro de la transacción.