Está en la página 1de 24

Transacciones y Concurrencia en Oracle

Transacciones

En Oracle:

Una transaccin es una unidad de trabajo atomica que contiene una o ms sentencias SQL Los efectos de las transacciones pueden ser confirmados (aplicados a la BD) o retrocedidos (deshechos de la BD). Una transaccin siempre comienza con la primera sentencia SQL, no existe el comando BEGIN. Una transaccin cuando una transaccin termina siempre es confirmada o retrocedida, ya se explcitamente a travs de los comando COMIIT o ROLLBACK o implcitamente al ocurrir una sentencia DDL.

Sentencias Utilizadas

Contiene la sintaxis de las sentencias del lenguaje de definicin de datos (Data Definition Language o DDL) como CREATE TABLE, CREATE INDEX, CONSTRAINTS, DATATYPES, etc. Las sentencias del lenguaje de manipulacin de datos (Data Manipulation Language o DML) como SELECT, UPDATE, INSERT, DELETE, COMMIT, ROLLBACK, etc. El uso de funciones estndar como TO_CHAR, TO_DATE, TO_NUMBER, DECODE, MONTHS_BET WEEN,INSTR, etc...

Ejemplo
LA TRANSACCION COMIENZA AQUI

UPDATE savings_accounts SET balance = balance - 500 WHERE account = 3209; UPDATE checking_accounts SET balance = balance + 500 WHERE account =3208; INSERT INTO journal VALUES (journal_seq.NEXTVAL, '1B' 3209, 3208, 500); COMMIT WORK;

SENTENCIAS DE LA TRANSACCIN

LA TRANSACCION TERMINA AQUI UNA NUEVA TRANSACCION COMIENZA AQUI


SELECT UPDATE

Ejecucin de Sentencias y Confirmacin

Que una sentencia se ejecute correctamente no implica que la transaccin a la que pertenece sea confirmada. Todas las sentencias de una transaccin pueden correr correctamente, pero sus efectos pueden ser desechos hasta que la transaccin sea confirmada. La confirmacin indica que los cambios realizados durante una transaccin son hechos permanentes. En Oracle, las transacciones se confirman cuando:

Se invoca explcitamente a la sentencia COMMIT. Automticamente (implcitamente), cuando se produce una sentencia DDL o cuando se termina la sesin con la BD.

Lo que se persigue con el uso de transacciones es por un lado contar con una transparencia adecuada de las acciones concurrentes a una base de datos y por el otro tener una transparencia adecuada en el manejo de las fallas que se pueden presentar en una base de datos.

Retroceso a nivel de sentencia

El retroceso a nivel de sentencia (statement level rollback) ocurre cuando se produce un error al ejecutar una sentencia. Su efecto es como si la sentencia nunca hubiera ocurrido. Ejemplos son:

Insercin de una clave primaria duplicada Insercin del valor nulo en un campo no nulo. Cuando existe un deadlock, se retrocede una de las sentencias involucradas.

Errores descubiertos en la etapa de parsing de la sentencia no implica un retroceso a nivel de sentencia. El retroceso de una sentencia solo implica la perdida del trabajo realizado por la misma. Si una sentencia DDL es retrocedida el COMMIT implcito no es desecho.

Confirmacin de Transacciones

Cuando una transaccin se confirma, los cambios provocados por ellas se hacen permanentes. Antes de la confirmacin ocurre los siguiente:

Oracle ha generado informacin para deshacer la transaccin. Oracle ha generado informacin para rehacer la transaccin. Los cambios han sido aplicados a los buffers del SGA. La transaccion se marca como finalizada y su System Change Number (SCN) es aplicado a los registros de la tabla. El Log Writter Process (LGWR) escribe las entradas redo log del SGA y SCN de la transaccin. Este evento atmico constituye la confirmacin de la transaccin. Los bloqueos de la transaccin son liberados. La transaccin se marca como completa.

Cuando la transaccin se confirma, ocurre los siguiente:


SENTENCIAS
Las sentencias de finalizacin de transaccin son: COMMIT: la transaccin termina correctamente, se vuelcan los datos al tablespace original y se vaca el RBS. ROLLBACK: se rechaza la transaccin y el vaca el RBS. Cualquier cambio realizado desde que se inici la transaccin se deshace, quedando la base de datos en el mismo estado que antes de iniciarse la transaccin.

Ejemplo de commit

Considere las siguientes sentencias:

INSERT INTO pais VALUES(PY, PARAGUAY); UPDATE persona SET pais = PY WHERE id = 1; COMMIT;

Cuando se ejecuta la sentencia COMMIT los cambios realizados en la base de datos son hechos permanentes.

Retroceso de Transacciones

Retroceder (Rollback) significa deshacer todos los cambios hechos por las sentencias de una transaccin sin confirmar: Para ello Oracle hace uso del los undo tablespaces para almacenar los valores antiguos. Los tipos de retrocesos pueden ser:

Statement Level Rollback Retroceso hasta un punto de recuperacin (save point) Retroceso por pedido del usuario Retroceso debido a una terminacin anormal Retroceso de todas las transacciones por terminacin anormal del sistema Retroceso de transacciones incompletas en la etapa de recuperacin del sistema. Oracle deshace todos los cambios realizados utilizando los datos del undo tablespace Oracle libera los bloqueos que mantena la transaccin. Oracle finaliza la transaccin.

Cuando una transaccin se retrocede totalmente:


Ejemplo de Rollback

Considere las siguientes sentencias:

INSERT INTO pais VALUES(1, PY, PARAGUAY); UPDATE persona SET pais = PY WHERE id = 1; ROLLBACK;

Tanto los resultados de la sentencias INSERT y UPDATE son deshechos cuando se invoca a la sentencia ROLLBACK;

Punto de control (Savepoints)

Es posible declarar puntos intermedios en una transaccin que permiten guardar el trabajo realizado hasta el mismo y a partir de los cuales es posible continuar cuando ocurre un fallo. Dentro de una transaccin se pueden crear los llamados punto de control mediante la sentencia:
SAVEPOINT Nombre_punto_control;

Para retroceder una transaccin hasta un punto de control se utiliza la sentencia ROLLBACK TO SAVEPOINT <nombre> Cuando una transaccin es retrocedida:

Oracle solo deshace las sentencias realizadas luego del punto de control. Oracle preserva el savepoint correspondiente y los savepoints anteriores a este. Oracle libera los bloqueos obtenidos luego del savepoint y preserva los obtenidos antes del mismo.

Una transaccin que se retrocede a un punto de control permanece activa.

Caractersticas

Consistencia: Una transaccin es un programa correcto que lleva la base de datos de un estado consistente a otro con la misma caracterstica. Gracias a esto, las transacciones no violan las reglas de integridad de una base de datos. Aislamiento: Una transaccin en ejecucin no puede revelar sus resultados a otras transacciones concurrentes antes de su commit. Ms an, si varias transacciones se ejecutan concurrentemente, los resultados deben ser los mismos que si ellas se hubieran ejecutado de manera secuencial (seriabilidad).La seriabilidad consiste en asegurarse que los cambios siguen un orden adecuado.

Atomicidad: Una transaccin es tratada como una unidad de operacin. Por lo tanto todas las acciones de la transaccin se llevan a cabo o ninguna de ellas se realiza.La atomicidad requiere que si una transaccin se interrumpe por una falla, sus resultados parciales deben ser deshechos. Se efectan todas las transacciones, pero en caso de fallas no se realiza ninguna. Una transaccin debe concluir comprometida o abortada. Durabilidad: Es la propiedad de las transacciones que asegura que una vez que una transaccin realiza su commit, sus resultados son permanentes y no pueden ser borrados de la base de datos, se asegura que los resultados de una transaccin sobrevivirn a fallas del sistema

Transacciones Serializables

Oracle solo permite que las transacciones serializables realicen cambios solo si se puede comprobar que estos sean consistentes con un planificacin secuencial. Cuando una transaccin serializable intenta modificar una fila ya modificada por otra transaccin posterior confirmada Oracle genera un error:

ORA-08177: Cannot serialize access for this transaction La sentencia es entonces retrocedida pero la transaccin no. Confirmar la transaccin para guardar el trabajo hecho. Ejecutar sentencias correctivas (ROLLBACK TO SAVEPOINT).

Cuando ocurre el error de serializacin se puede:


Deshacer la transaccin (ROLLBACK)

Transacciones Serializables

Eleccin del nivel de aislamiento

Read Commited

Cuando el sistema debe ser capaz de procesar rpidamente mltiples transacciones. Cuando la posibilidad de que dos transacciones modifiquen los mismos datos sea casi nula. Cuando las transacciones no sean afectadas por lecturas no repetibles y lecturas fantasmas. Cuando la probabilidad de que dos transacciones modifiquen las mismas filas sea baja. Cuando las transacciones son afectadas por lecturas no repetibles y lecturas fantasmas. No apto para transacciones largas, pues pueden ocurrir problemas de secuencialidad.

Serializable

Bloqueos en Oracle

Oracle provee concurrencia e integridad de datos entre transacciones concurrentes a travs de bloqueos. Como los mecanismos de control de concurrencia de Oracle estn ligados a mecanismo de bloqueos, Oracle proporciona y administra automticamente mecanismos del bloqueos En Oracle existen bloqueos implcitos para las sentencias SQL, as los usuarios (casi) no necesitan bloquear explcitamente los datos. Estos mecanismos automticos ocurren al ms bajo nivel del restrictividad (a nivel de filas) garantizndose integridad de datos y alta concurrencia.

Bloqueos en Oracle

Para un entorno multiusuario, Oracle utiliza dos modos de bloqueo:

Bloqueo Exclusivo (Exclusive Lock)


Este bloqueo se obtiene al modificar los datos. Solo la transaccin que obtiene este bloqueo puede alterar los datos, otras transacciones quedan bloqueadas.

Bloqueo Compartido (Share Lock)

Permite que mltiples transaccin puedan leer simultneamente los datos pero evita el acceso concurrente de escritores.

Un bloqueo adquirido por una transaccin es mantenido hasta que esta finalice. Los bloqueos adquiridos luego de un SAVEPOINT son liberados cuando la transaccin es retrocedida hasta el mismo.

Deadlocks

Oracle detecta Deadlocks y los resuelve retrocediendo una de las sentencias involucradas, la que pertenece a la transaccin que detecta el deadlock.

Bloqueos explcitos
SQL > LOCK TABLE <tabla> IN <lockmode> MODE [NOWAIT]
MODOS: ROW SHARE (RS)

Permite acceso concurrente a la tabla bloqueada (consultas y actualizaciones en filas no bloqueadas). Impide que otros usuarios bloqueen la tabla completa en modo EXCLUSIVE.

ROW EXCLUSIVE (RX) Existen Filas bloqueadas en modo exclusivo


Permite acceso concurrente a la tabla bloqueada (consultas y actualizaciones en filas no bloqueadas). Impide que la tabla se bloquee en modo SHARE, SHARE EXCLUSIVE y EXCLUSIVE. Permite consultas concurrentes Se pausa cualquier intento de modificacin desde otra transaccin Sirve para tener una versin estable, que no puede modificarse, de los datos mientras alguien tenga un bloqueo SHARE. Otras transacciones no pueden bloquear ROW EXCLUSIVE ni EXCLUSIVE.

SHARE (S)

Bloqueos explcitos

SQL > LOCK TABLE <tabla> IN <lockmode> MODE [NOWAIT]

MODOS: SHARE ROW EXCLUSIVE (SRX)


EXCLUSIVE (X)

Permite que otras transacciones lean la tabla Slo la transaccin que posee el lock puede modificar la tabla Se impide que otras transacciones bloqueen SHARE Slo una transaccin puede tener SHARE ROW EXCLUSIVE sobre un tabla No permite que se cambie el tipo de bloqueo sobre la tabla. Permite querys sobre la tabla bloqueada Prohibe cualquier otra actividad sobre la tabla (actualizaciones, otros bloqueos, etc.) Slo una transaccin puede tener un bloqueo EXCLUSIVE.

Bloqueos Explcitos

SENTENCIA
SELECT ... FROM table INSERT INTO table UPDATE table ...

Bloqueo de Bloqueo de filas la Tabla


No Si Si No RX RX

Implicito
No Si Si

DELETE FROM table ...


SELECT ... FOR UPDATE LOCK TABLE <tabla> IN ... ROW SHARE MODE ROW EXCLUSIVE MODE SHARE MODE SHARE EXCLUSIVE MODE EXCLUSIVE MODE

Si
Si No No No No No

RX
RS RS RX S SRX X

Si
Si No No No No No

También podría gustarte