You are on page 1of 9

Niveles de aislamiento

Las transacciones especifcan un nivel de aislamiento que defne el grado en que se


debe aislar una transacción de las modifcaciones de recursos o datos realizadas por
otras transacciones. Los niveles de aislamiento se describen en cuanto a los efectos
secundarios de la simultaneidad que se permiten, como las lecturas desfasadas o
fcticias.
Control de los niveles de aislamiento de transacción:

 Controla si se realizan bloqueos cuando se leen los datos y qué tipos de


bloqueos se solicitan.
 Duración de los bloqueos de lectura.
 Si una operación de lectura que hace referencia a flas modifcadas por otra
transacción:
 Se bloquea hasta que se libera el bloqueo exclusivo de la fla.
 Recupera la versión confrmada de la fla que existía en el momento en el
que empezó la instrucción o la transacción.
 Lee la modifcación de los datos no confrmados.

El nivel de aislamiento para una sesión SQL establece el comportamiento de los


bloqueos para las instrucciones SQL.

El estándar ANSI/ISO SQL defne cuatro niveles de aislamiento transaccional en


función de tres eventos que son permitidos o no dependiendo del nivel de
aislamiento. Estos eventos son:

Lectura sucia. Las sentencias SELECT son ejecutadas sin realizar bloqueos, pero
podría usarse una versión anterior de un registro. Por lo tanto, las lecturas no son
consistentes al usar este nivel de aislamiento.

Lectura norepetible. Una transacción vuelve a leer datos que previamente había
leído y encuentra que han sido modifcados o eliminados por una transacción
cursada.

Lectura fantasma. Una transacción vuelve a ejecutar una consulta, devolviendo un


conjuto de registros que satisfacen una condición de búsqueda y encuentra que
otros registro que satisfacen la condición han sido insertadas por otra transacción
cursada.

Los niveles de aislamiento SQL son defnidos basados en si ellos permiten a cada
uno de los eventos defnidos anteriormente. Es interesante notar que el estándar
SQL no impone un esquema de cierre específco o confere por mandato
comportamientos particulares, pero más bien describe estos niveles de aislamiento
en términos de estos teniendo muchos mecanismos de cierre/coincidencia, que
dependen del evento de lectura

Concurrencia Oracle

La ejecución concurrente de varias transacciones debe garantizar que producirán el


mismo resultado que las mismas en serie.

En general, las BD multi-usuarios utilizan bloqueos en el control de concurrencia.


Niveles de bloqueo:

 Bloqueo exclusivo. No permite que un recurso sea compartido. La primera


transacción que lo bloquea es la única que puede alterarlo.
 Bloqueo compartido. Permite que un recurso sea compartido. Muchas
transacciones pueden adquirir este tipo de bloqueo sobre el mismo recurso.
 Oracle utiliza además multiversión para permitir el acceso concurrente a los
datos.

Control de concurrencia multiversión

Oracle automáticamente proporciona consistencia de lectura: datos que una


consulta ve son de un mismo punto en el tiempo (consistencia de lectura a nivel de
sentencia).

También puede proporcionar consistencia de lectura a todos las consultas de una


transacción (consistencia a nivel de transacción).

¿Cómo?

 Oracle utiliza la información existente en el segmento de anulación (datos


antiguos).
 Cuando una consulta comienza se le asigna un número (SCN).
 Datos leidos por una consulta tienen un SCN más pequeño.
 Bloques con SCN más alto (más reciente) son reconstruidos con la información
contenida en el segmento de anulación.

Oracle proporciona consistencia de lectura a dos niveles:


Nivel de sentencia:

 Oracle garantiza que los datos devueltos por una consulta son consistentes con
respecto al tiempo en que empezó la consulta.
 Oracle observa el SCN (system change number) cuando la consulta entra en
ejecución.
 Solo los datos aceptados antes de dicho SCN serán utilizados.
 Segmentos de anulación se utilizan para buscar versiones anteriores de los
datos.

Nivel de transacción:

 Datos vistos por todas las consultas de una transacción son consistentes con
respecto a un punto en el tiempo.
 Se debe indicar que la transacción es Read-Only.
 Si las transacciones son de solo lectura, se actúa como en el caso anterior.
 Si existen otro tipo de consultas (modifcar, borrar,insertar..) se deben utilizar
bloqueos.

Oracle proporciona tres niveles de aislamiento:


 read-committed: Nivel de aislamiento por defecto. Cada consulta de una
transacción solo ve los datos que fueron confrmados antes de que la consulta
comenzara. Se producen lecturas no reproducibles.
 serializable transactions: Solamente se ven los cambios realizados por
transacciones confrmadas + cambios efectuados por ella misma.
 read-only: transacciones de solo lectura ven datos confrmados antes de
empezar y no permiten modifcaciones de los datos.

Para seleccionar uno de estos comandos al comienzo de una transacción:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;


SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION ISOLATION LEVEL READ ONLY;

Para establecer un nivel de aislamiento para el conjunto de transacciones siguientes:

ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;


ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;

Elección de un nivel de aislamiento: los dos niveles siguientes proporcionan un alto


grado de concurrencia mediante la combinación de multiversión y bloqueos.
read-committed:

 nivel por defecto.


 apropiado para la mayoría de las aplicaciones.
 Aplicaciones donde el índice de llegada de transacciones es alto.
 Si es poco problable que se ejecute una misma consulta dos veces

serializable:

 Adecuado cuando es poco problable que dos transacciones concurrente


modifquen las mismas flas.
 Cuando las transacciones de larga duración son principalmente de solo lectura.
 No aparecen lecturas no reproducibles.

Bloqueos en Oracle
Bloqueos son los mecanismos que utiliza Oracle para evitar que dos transacciones
accedan al mismo recurso.

Automáticamente Oracle obtiene los bloqueos necesarios cuando ejecuta alguna


sentencia en SQL.

ORACLE utiliza el nivel menos restrictivo guiándose por las siguientes reglas:

 Operaciones de lectura no esperan a las de escritura sobre los mismos datos.


 Operaciones de escritura no esperan a las de lectura sobre los mismos datos.
 Operaciones de escritura solamente esperan a otras operaciones de escritura
que intentan modifcar la misma tupla.

Se utilizan bloqueos a nivel de fla: una transacción espera cuando intenta modifcar
una fla modifcada por una transacción no confrmada.

ORACLE no escalona los bloqueo.

Interbloqueos: ocurren cuando dos o más usuarios están esperando datos


bloqueados por los otros. Oracle automáticamente detecta situaciones de
interbloqueo y los resuelve abortando una de las transacciones. Se detectan
mediante grafos de esperas.
COMMIT Y ROLLBACK

Estructura de una transacción

Una transacción de base de datos consta de una o más instrucciones.


Específcamente, una transacción consiste en una de las siguientes:

 Una o más sentencias DML que en conjunto constituyen un cambio atómica a la


base de datos
 Una declaración DML

Una transacción tiene un principio y un fnal.

Inicio de una transacción

Una transacción comienza cuando se encuentra la primera sentencia de SQL


ejecutable.

Una sentencia de SQL ejecutable es una instrucción SQL que genera llamadas a una
instancia de base de datos, incluyendo DML y DDL y la instrucción SET
TRANSACCIÓN.

Cuando se inicia una transacción, Oracle Database le asigna un segmento undo de


datos para grabar las entradas Rollback para la nueva transacción. Un id de
transacción se asigna durante la primera instrucción DML.

Un ID de transacción es único y representa el número de segmento de deshacer y


número de secuencia.

El siguiente ejemplo se ejecuta una instrucción UPDATE para iniciar una transacción,
Verifcamos su comportamiento consultando la vista V$transacción,

Ejemplo básico en Oracle precio del dólar con respecto al peso.


Iniciamos dos consolas Oracle
 SYS_CONTEXT devuelve el valor del parámetro asociado con el espacio de nombres
de la instante actual. Se puede utilizar esta función en SQL y PL/SQL.SYS_CONTEXT
debe ejecutarse localmente.
 Dual es una tabla, creada durante la instalación, con una sola columna llamada
DUMMY y una sola fla de contenido 'X'. El propietario es SYS y puede ser accedida
por cualquier usuario.
 V$TRANSACTION vista de transacciones declaradas por Oracle
 v$session vista de sesión declaradas por Oracle

Sesión 1 Sesión 2
CONNECT umg/umg CONNECT umg/umg AS SYSDBA
SELECT XID AS "txn id", XIDUSN AS "undo
seg", XIDSLOT AS "slot", XIDSQN AS "seq",
STATUS AS "txn status", addr
FROM V$TRANSACTION;
SELECT sid FROM v$session
WHERE taddr = 'BDB0F06C';
SELECT COUNT(*) n FROM
V$TRANSACTION;
COMMIT

Final de una transacción

 Una transacción termina cuando se produce alguna de las siguientes acciones:

Un usuario emite una sentencia COMMIT -guardar- o ROLLBACK -deshacer- sin una
cláusula SAVEPOINT -punto de restauración.

 Una transacción termina cuando se produce alguna de las siguientes acciones:

Un usuario emite una sentencia COMMIT -guardar- o ROLLBACK -deshacer- sin una
cláusula SAVEPOINT -punto de restauración.

 Un usuario ejecuta una sentencia DDL como CREATE, DROP, RENAMEZ o ALTER.

La base de datos emite una sentencia COMMIT implícito antes y después de cada
instrucción DDL. Si la transacción actual contiene instrucciones DML, a continuación,
Oracle Database primera confrma la transacción y luego corre y se compromete la
sentencia DDL como una nueva, transacción de un único estado.
 Un usuario sale normalmente de la mayoría de las utilidades y herramientas de
base de datos Oracle, haciendo que la transacción actual que se ha comprometido
de forma implícita. El comportamiento AUTOCOMMIT cuando un usuario se
desconecta depende de la aplicación y la confguración del gestor

SET TRANSACTION

Utilice la instrucción SET TRANSACTION para establecer la transacción actual como de


sólo lectura o de lectura/escritura, establecer su nivel de aislamiento, asignarle un
segmento de rollback, o asignar un nombre a la transacción.

Considere la siguiente información:

Fecha Para solventar obligaciones

11/07/16 18.8607

12/07/16 18.5991

13/07/16 18.4597

14/07/16 18.3006

15/07/16 18.3937

16/07/16 18.3061

READ

Sesión 1 Sesión 2
CONNECT umg/umg CONNECT umg/umg;
SET TRANSACTION READ ONLY; INSERT INTO dolar VALUES
('17/07/16',18.3061);
INSERT INTO dolar VALUES
('18/07/16',18.3061);
COMMIT COMMIT
READ/WRITE

Sesión 1 Sesión 2
CONNECT umg/umg CONNECT umg/umg;
SET TRANSACTION READ WRITE; SET TRANSACTION READ WRITE;
INSERT INTO dolar VALUES COMMIT
('11/07/16',18.8607);
INSERT INTO dolar VALUES
('12/07/16',18.5991);
INSERT INTO dolar VALUES
('13/07/16',18.4597);

SERIALIZABLE

Una transacción SERIALIZABLE opera en un ambiente que hace que parezca como si no
existieran otros usuarios que modifcan los datos en la base de datos. Cualquier fla se
lee está asegurada al ser el mismo en una de nueva lectura, y cualquier consulta se
ejecuta está garantizado para devolver los mismos resultados para la vida de una
transacción.

CREATE TABLE a ( x INT );


CREATE TABLE b ( x INT );

Sesión 1 Sesión 2
CONNECT umg/umg;
CREATE TABLE a ( x INT );
CREATE TABLE b ( x INT );
ALTER SESSION SET
CONNECT umg/umg;
ISOLATION_LEVEL=SERIALIZABLE;
ALTER SESSION SET
INSERT INTO a SELECT COUNT(*) FROM b;
ISOLATION_LEVEL=SERIALIZABLE;
INSERT INTO b SELECT COUNT(*) FROM a;
INSERT INTO b SELECT COUNT(*) FROM a;
... INSERT INTO b SELECT COUNT(*) FROM
a;
COMMIT; COMMIT;
Para crear un usuario y concederle permisos .

CREATE USER nombre


IDENTIFIED BY contraseña
[DEFAULT TABLESPACE nombreTableSpace]
[TEMPORARY TABLESPACE nombreTemp]
[QUOTA INT {K|M} | UNLIMITED ON nombreTableSpace]
[PROFILE perfl]
[PASSWORD EXPIRE]
[ACCOUNT {LOCK | UNLOCK}]
;

GRANT privilegio1 [[,privilegio2, ...] | ALL]


[(columna1[,columna2,...])]
[ON usuario[.objeto] | ANY TABLE]
TO {nombreUsuario | rol | PUBLIC}
[WITH GRANT OPTION]
;

SET TRANSACTION
Transaction Management
Transactions
Data Concurrency and Consistency

You might also like