2. NIVELES DE AISLAMIENTO
El nivel de aislamiento de una
transacción
(transaction
isolation
level) define el grado en que se aísla
una
transacción
de
las
modificaciones de recursos o datos
realizadas por otras transacciones
3. El
nivel de aislamiento de una transacción
es una característica de vital importancia
en el desarrollo de aplicaciones de base
de datos, ya que afecta a los tipos y
duración de bloqueos que se producen en
una infraestructura de base de datos, lo
cual, tiene efectos directos en el
rendimiento y tiempo de respuesta de
nuestras consultas y transacciones
4. Lectura
sucia:
Las sentencias select son
ejecutadas si realizar bloques, pero
podría usarse una versión anterior
de un registro.
las lecturas no son consistentes al
usar este nivel de aislamiento.
5. Lectura no repetible:
una transacción vuelve a
leer datos que previamente
había leído y encuentra que
han sido modificados o
eliminados por una
transacción.
6. Lectura fantasma:
Una
transacción vuelve a ejecutar
una
consulta,
devolviendo
un
conjunto 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.
7. Niveles de aislamiento:
Comportamiento permitido
Lectura
Nivel de aislamiento
Sucia
No repetible
Fantasma
Sí
Sí
Sí
Lectura comprometida
No
Sí
Sí
Lectura repetible
No
No
Sí
Secuenciable
No
No
No
Lectura no comprometida
8. SQL
permite todos estos
niveles, Oracle sólo permite
la lectura comprometida y
secuenciable.
Los
niveles se pueden
establecer en ambos para
cada transacción.
9. 4 niveles de aislamiento basados en bloqueos.
• READ UNCOMMITTED puede recuperar datos
modificados pero no confirmados por otras
transacciones (lecturas sucias - dirty reads).
• En este nivel se pueden producir todos los efectos
secundarios de simultaneidad (lecturas sucias,
lecturas no repetibles y lecturas fantasma
• - EJEMPLO: entre dos lecturas de un mismo registro
en una transacción A, otra transacción B puede
modificar dicho registro, pero no hay bloqueos ni
versiones de lectura, por lo que se minimiza la
sobrecarga.
10. Una
operación de lectura (SELECT) no
establecerá bloqueos compartidos (shared
locks) sobre los datos que está leyendo, por
lo que no será bloqueada por otra
transacción que tenga establecido un
bloqueo exclusivo por motivo de una
operación de escritura.
Este nivel de aislamiento ofrece grandes
beneficios de rendimiento, pero sólo se
utiliza en casos en que la ocurrencia de
lecturas sucias (dirty reads) no sea un
problema.
11. READ COMMITTED
permite
que entre dos lecturas de un
mismo registro en una transacción A, otra
transacción B pueda modificar dicho
registro, obteniendo diferentes resultados
de la misma lectura.
Evita las lecturas sucias (dirty reads), pero
por el contrario, permite lecturas no
repetibles
12.
Con ese nivel de aislamiento, una operación de
lectura (SELECT) establecerá bloqueos compartidos
(shared locks) sobre los datos que está leyendo. Sin
embargo, dichos bloqueos compartidos finalizarán
junto con la propia operación de lectura, de tal
modo que entre dos lecturas cabe la posibilidad
de que otra transacción realice una operación de
escritura.
EJEMPLO: ( UPDATE) en este caso, la segunda
lectura obtendrá datos distintos a la primera lectura
(lecturas no repetibles).
13. REPEATABLE READ
Evita que entre dos lecturas de un mismo
registro en una transacción A, otra transacción B
pueda modificar dicho registro, con el efecto de
que en la segunda lectura de la transacción A
se obtuviera un dato diferente. De este modo,
ambas
lecturas
serían
iguales
(lecturas
repetidas).
Una operación de lectura (SELECT) establecerá
bloqueos compartidos (shared locks) sobre los
datos que está leyendo, y los mantendrá hasta el
final de la transacción, garantizando así que no se
produce lecturas no repetibles (non repeatable
reads).
14. la Mayor consistencia en la transacción, mediante
mayores recursos y bloqueos evitan los problemas de
las lecturas sucias y de las lecturas no repetibles.
Este modo de aislamiento no evita las lecturas
fantasma, es decir, una transacción podría ejecutar
una consulta sobre un rango de filas
EJEMPLO: ( 100 filas) y de forma simultánea otra
transacción podría realizar un inserción de una o
varias filas sobre el mismo rango.
15. SERIALIZABLE
Garantiza que una transacción recuperará
exactamente los mismos datos cada vez que repita
una operación de lectura, es decir, la misma
sentencia SELECT con la misma cláusula WHERE
devolverá el mismo número de filas, luego no se
podrán insertar filas nuevas en el rango cubierto
por la WHERE, etc.
16. Se
evitarán las lecturas fantasma) aunque para
ello aplicará un nivel de bloqueo que puede
afectar a los demás usuarios en los sistemas
multiusuario (realizará un bloqueo de un rango de
índice conforme a la cláusula WHERE y si no es
posible bloqueará toda la tabla).
Evita los problemas de las lecturas sucias (dirty
reads), de las lecturas no repetibles (non
repeatable reads), y de las lecturas fantasma
(phantom reads).
17. es
muy importante recordar que el tiempo de
espera por un bloqueo por defecto en SQL es
infinito. Es decir, si tenemos una transacción que
está manteniendo un bloqueo sobre un recurso.
Para ello, es posible utilizar la sentencia SET
LOCK_TIMEOUT para especificar el tiempo máximo
de espera por bloqueo (en milisegundos).
En caso de que una transacción alcance el tiempo
máximo de espera por bloqueo, se producirá un
mensaje de error.
1222 (Msg 1222, Level 16, State 51, Line 1. Lock request
time out period exceeded.).
También es posible conocer el actual tiempo de
espera por bloqueo, consultando el valor de la
función del sistema @@LOCK_TIMEOUT.
18.
19.
en vez de realizar un uso intensivo de
bloqueos, su funcionamiento se basa en el
almacenamiento de versiones de filas en
TEMPDB.
Si una transacción empieza en un momento del
tiempo determinado, sólo será capaz de
acceder a la información de la base de datos
que era real en aquel momento del tiempo.
conflictos de actualización lo cual implicaría que la
transacción se deshace (Rollback).
20. Tiene
la ventaja de utilizar el versionado
de filas de tal modo, que las lecturas no
son bloqueadas por las escrituras y
viceversa.
Pueden producirse lecturas no repetibles y
lecturas fantasmas.
21. En PostgreSQL el bloqueo puede ser
Compartido (Share) o Exclusivo (Exclusive), son
administrados
por
un
“Lock
Manager.
si un bloqueo toma mucho tiempo en
ejecutarse se produce un Deadlock, el sistema
lo
muestra
como
un
Timeout.
Un bloqueo puede darse a una tupla, una
página
o
una
tabla
completa.
En PostgreSQL existe una tabla de locks, y esta
es consultada antes de ejecutar una
transacción
nueva.
22. Bloqueos y Tablas
Postgres ofrece varios modos de bloqueo para controlar el acceso
concurrente a los datos en tablas.
Todos los modos de bloqueo (excepto para AccessShareLock)
adquiridos en un transacción se mantienen hasta la duración de la
transacción.
Existen dos tipos de bloqueos:
• Bloqueos a nivel de tabla
• Bloqueos a nivel de registro
23. Bloqueos a Nivel de tabla
AccessShareLock Un modo de bloqueo adquirido automáticamente sobre
tablas que están siendo consultadas. Postgres libera estos bloqueos después
de que se haya ejecutado una declaración.
RowShareLock Adquirido por SELECT FOR UPDATE y LOCK TABLE
para declaraciones IN ROW SHARE MODE.
RowExclusiveLock Lo adquieren UPDATE, DELETE, INSERT y LOCK
TABLE para declaraciones IN ROW EXCLUSIVE MODE.
ShareLock Lo adquieren CREATE INDEX y LOCK TABLE para
declaraciones IN SHARE MODE.
ShareRowExclusiveLock Lo toma LOCK TABLE para declaraciones IN
SHARE ROW EXCLUSIVE MODE.
ExclusiveLock Lo toma LOCK TABLE para declaraciones IN EXCLUSIVE
MODE.
AccessExclusiveLock Lo toman ALTER TABLE, DROP TABLE, VACUUM
FULL, por defecto en un LOCK TABLE
24. Bloqueos a Nivel de Fila
• Este tipo de bloqueos se producen cuando campos internos de
una fila son actualizados (o borrados o marcados para ser
actualizados). Postgres no retiene en memoria ninguna
información sobre filas modificadas y de este modo no tiene
límites para el número de filas bloqueadas sin incremento de
bloqueo.
• Sin embargo, SELECT FOR UPDATE modificará las filas
seleccionadas marcándolas, de tal modo que se escribirán en
el disco.
• Los bloqueos a nivel de fila no afecta a los datos consultados.
Estos son usados para bloquear escrituras a la misma fila
únicamente.