Você está na página 1de 16

Universidad Nacional de Piura

INTRODUCCIN

Existen situaciones en las que necesitamos hacer ms de una consulta


al mismo tiempo, y todas tienen que ser correctas para que los datos
sean

consistentes

informacin

errnea,

tengan

sentido,

grupo

este

de

de

otro

modo

sentencias

se

tendramos
les

llama

transacciones.
Una transaccin en un sistema de gestin de bases de datos. En un
principio MySQL no soportaba las transacciones, esto cambi a partir de
la versin 4, con el uso de tablas InnoDB. InnoDB ofrece cuatro niveles
de aislamiento de transacciones, el nivel de aislamiento ser establecido
por los usuarios de acuerdo a sus necesidades. Cabe mencionar que el
nivel predeterminado en InnoDB es REPEATABLE READ.
Las transacciones son ampliamente utilizadas en sistemas bancarios por
mencionar solo un ejemplo.
En presente trabajo tiene como objetivo mostrar casos semejantes a la
realidad de los cuatro IL: READ UNCOMMITTED, READ COMMITTED,
REPEATABLE READ, SERIALIZABLE y mostrar sus ventajas y desventajas
sobre el uso de cada nivel de aislamiento.

Universidad Nacional de Piura

NIVELES DE AISLAMIENTO (ISOLATION LEVEL IL)


Utilizaremos la Base de Datos RESERVAS, que contiene las tablas
sector y asiento cuyos campos son descritos a continuacin:
Tabla: sector
Name
Type
idSector
Int (11)
Descripcion
Varchar
(80)
CantidadReserv
Int (11)
ados
Capacidad
Int (11)

Tabla: asiento
Name
Type
idAsiento
Int (11)
Descripcion
Varchar (80)
Estado
Char (1)

Caso N 01: READ UNCOMMITTED


El cliente 1 (T1) y el cliente 2 (T2) desean asistir a un partido de
futbol, ambos quieren hacer la reserva de un asiento del SECTOR 4 del
estadio; la capacidad de ese sector es de 50 personas. T1

hace una

consulta para saber cuntos asientos quedan disponibles en ese sector,


el resultado es que solo hay un espacio disponible, hace la reservacin
aumentando la cantidad de reservas en 1. T2 hace la misma consulta, el
resultado es que el SECTOR 4 est en su capacidad mxima y por lo
tanto tendr que hacer su reserva en otro sector, sin embargo el cliente
1 aun no ha confirmado su transaccin esto se denomina lectura sucia.

Universidad Nacional de Piura

Verificamos

el

nivel

de

aislamiento

(local)

que

est

activo

posteriormente procederemos a cambiarlo (si es necesario), para ello


debemos teclear lo siguiente:

SELECT @@TX_ISOLATION;
SET SESSION TRANSACTION
READ UNCOMMITTED;

T1

ISOLATION

LEVEL

T2

Establece la conexin
C:\>mysql -u root reservas
Welcome to the MySQL monitor.
Commands end with ; or \g.
Your MySQL connection id is 63
Server version: 5.0.21-community-nt
Type 'help;' or '\h' for help. Type '\c' to
clear the buffer.

Verifica el nivel de aislamiento


mysql> select @@tx_isolation;
+---------------------------+
| @@tx_isolation
|
+---------------------------+
| REPEATABLE-READ |
+---------------------------+
1 row in set (0.00 sec)

Cambia el nivel de aislamiento


mysql> set session transaction isolation
level READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)

Verifica si el cambio es correcto


mysql> select @@tx_isolation;
+------------------------------+
| @@tx_isolation
|
+------------------------------+
| READ-UNCOMMITTED |
+------------------------------+
1 row in set (0.00 sec)

Universidad Nacional de Piura

T1 inicia la transaccin
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

Establece la conexin
C:\>mysql -u root reservas
Welcome to the MySQL monitor.
Commands end with ; or \g.
Your MySQL connection id is 64
Server version: 5.0.21-community-nt
Type 'help;' or '\h' for help. Type '\c' to clear
the buffer.

Verifica el nivel de aislamiento


mysql> select @@tx_isolation;
+---------------------------+
| @@tx_isolation
|
+---------------------------+
| REPEATABLE-READ |
+---------------------------+
1 row in set (0.00 sec)

Cambia el nivel de aislamiento


mysql> set session transaction isolation
level READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)

Verifica si el cambio es correcto


mysql> select @@tx_isolation;
+------------------------------+
| @@tx_isolation
|
+------------------------------+
| READ-UNCOMMITTED |
+------------------------------+
1 row in set (0.00 sec)

T2 inicia la transaccin
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

T1 realiza una consulta, para saber


4

Universidad Nacional de Piura

si hay espacio disponible en


SECTOR 4

el

mysql> select * from sector where


idSector=4;
+-----------+---------------+-------------------------+--------------+
| idSector | Descripcion| CantidadReservados|
Capacidad |
+-----------+---------------+-------------------------+--------------+
|
4
| SECTOR 04 |
49
50
|
+-----------+---------------+-------------------------+--------------+

1 row in set (0.00 sec)

T1 realiza una reservacin en el


SECTOR 4
mysql> update sector set
CantidadReservados=CantidadReservados
+1 where idSector=4;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

Lectura sucia

T2 realiza una consulta, para saber


si hay espacio disponible en
el
SECTOR 4, pero se da con la
sorpresa que ese sector est en su
capacidad mxima, sin embargo T1
aun
no
ha
confirmado
su
transaccin generando una lectura
sucia
mysql> select * from sector where
idSector=4;
+-----------+---------------+-------------------------+--------------+
| idSector | Descripcion| CantidadReservados|
Capacidad |
+-----------+---------------+-------------------------+--------------+
|
4
| SECTOR 04 |
50
50
|
+-----------+---------------+-------------------------+--------------+

1 row in set (0.00 sec)

Ti aborta la transaccin
5

Universidad Nacional de Piura

mysql> rollback;
Query OK, 0 rows affected (0.03 sec)

Como Ti abort la transaccin,


ahora T2 podr reservar en el
sector que deseaba
mysql> select * from sector;
+-----------+----------------+-------------------------+--------------+
| idSector | Descripcion | CantidadReservados|
Capacidad |
+-----------+----------------+-------------------------+--------------+
|
1
| SECTOR 01 |
50
50
|
|
2
| SECTOR 02 |
50
50
|
|
3
| SECTOR 03 |
0
50
|
|
4
| SECTOR 04 |
49
50
|
|
5
| SECTOR 05 |
50
50
|
+-----------+----------------+-------------------------+--------------+

|
|
|
|
|

5 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

T1

T2

CON PROCEDIMENTO ALMACENADO:


usp_Reservar
usp_CancelarReserva
T1 inicia la transaccin
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

T2 inicia la transaccin
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

T1 realiza una consulta, para saber


si hay espacio disponible en el
SECTOR 4

T2 realiza una consulta, para saber


si hay espacio disponible en el
SECTOR 4

mysql> select * from sector where


idSector=4;

mysql> select * from sector where


idSector=4;

+-----------+---------------+--------------------------

+-----------+---------------+--------------------------

Universidad Nacional de Piura


+--------------+
| idSector | Descripcion| CantidadReservados|
Capacidad |
+-----------+---------------+-------------------------+--------------+
|
4
| SECTOR 04 |
49
50
|
+-----------+---------------+-------------------------+--------------+

1 row in set (0.00 sec)

+--------------+
| idSector | Descripcion| CantidadReservados|
Capacidad |
+-----------+---------------+-------------------------+--------------+
|
4
| SECTOR 04 |
49
50
|
+-----------+---------------+-------------------------+--------------+

1 row in set (0.00 sec)

Ambos clientes desean hacer la reservacion en el SECTOR 4


T1 realiza la reservacin antes que
T2
mysql> call usp_Reservar (4,@);

+----------------------------------------------------+
| msg
|
+----------------------------------------------------+
| Reservacion completada correctamente |
+----------------------------------------------------+

1 row in set (0.00 sec)


Query OK, 0 rows affected (0.00 sec)

T2 hace la reservacion, resultando


un mensaje que le indica que ha
sobrepasado la capacidad mxima
mysql> call usp_Reservar(4,@);
+-----------------------------------------------------------------------+
| msg
|
+-----------------------------------------------------------------------+
| Se ha sobrepasado la capacidad maxima. No

Lectura sucia

se completo la reservacion!
|
+-----------------------------------------------------------------------+

1 row in set (0.00 sec)


Query OK, 0 rows affected (0.02 sec)

T1 cancela la reservacin
mysql> call usp_CancelarReserva(4,@);
+---------------------------------------------------+
| msg
|
+---------------------------------------------------+
| Reservacion cancelada correctamente! |
+---------------------------------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

Universidad Nacional de Piura

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

CONCLUSIN:

Ofrece grandes beneficios de rendimiento, pero slo se deber


utilizar en aquellos casos en que las lecturas sucias no sea un
problema.

Nivel de Aislamiento

Universidad Nacional de Piura

READ-COMMITTED

Nivel de
aislamiento
READCOMMITTE
D

Lectura sucia
-

Lectura no
repetibles
Puede ocurrir

Lectura
fantasmas
Puede ocurrir

Isolation level

Bloqueo de
escritura
v

Bloque de
lectura
-

Bloqueo de
rango
-

Niveles de aislamiento vs efecto de lectura

Base de datos
ll
que
utilizaremos

mysql> show tables;


mysql> show tables;

READCOMMITTE
D

+-------------------+
Niveles de
vs bloqueos

| Tables_in_estadio |

aislamiento

+-------------------+
| asiento

| sector

TABLA
+-------------------+
QUE
2 rows in set (0.00 sec)

Caso N
READ COMMITTED

mysql> select * from sector;


| idSector | Descripcion | CantidadReservados |
Capacidad |

2:

USAREM
OSel nivel READ
Colocamos a ambas conexiones en
COMMITTED, en mysql el nivel por defecto es el
REPEATABLE READ por ello tenemos
nivel de aislamiento.

1 | SECTOR 01 |

50 |

50 |

2 | SECTOR 02 |

50 |

50 |

3 | SECTOR 03 |

0|

4 | SECTOR 04 |

49 |

50 |

5 | SECTOR 05 |

50 |

50 |

50 |

Universidad Nacional de Piura

1.-Como ejemplo tenemos que dos usuarios del sistema de reservaciones de asientos para un partido de futbol,
estn haciendo uso de un oftware, uno de ellos realiza una nueva reservacin de un asiento en el SECTOR01,
mientras el otro tambin realiza la misma operacin.
Transaccin A

Transaccin B

Ambas transacciones se ponen el nivel de aislamiento en REPEATABLE READ para comenzar sus operaciones.
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.02 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> set global transaction isolation level read committed;


Query OK, 0 rows affected (0.02 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

La transaccin A esta seleccionando la idSector cual se esta haciendo un bloqueo compartido (de esta manera en transaccin B no
podr realizar ninguna operacin sobre ese registro.
5

mysql> select current_time(),idSector,Descripcion ,CantidadReservados,Capacidad


from sector where idSector='4'
lock inIN
share mode;
LOCK
+----------------+----------+-------------+--------------------+-----------+
SHARE IN
| current_time() | idSector | Descripcion
| CantidadReservados | Capacidad |
+----------------+----------+-------------+--------------------+-----------+
MODE (BS)
| 01:17:01
|
4 | SECTOR 04 |
49 |
50 |
+----------------+----------+-------------+--------------------+-----------+
1 row in set (0.02 sec)
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 01:18:41
|
+----------------+
1 row in set (0.00 sec)

CURRENT_TIME(
); ve la hora que
fue ejecutado la
transaccin

mysql> select current_time();


+----------------+
| current_time() |
+----------------+
| 01:19:01
|
+----------------+
1 row in set (0.00 sec)

Realizamos una reserva

Realizamos una consulta :

mysql> call ups_Reservar1('4');


Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from sector;


+----------+-------------+--------------------+-----------+
| idSector | Descripcion | CantidadReservados | Capacidad |
+----------+-------------+--------------------+-----------+
|
1 | SECTOR 01 |
50 |
50 |
|
2 | SECTOR 02 |
50 |
50 |
|
3 | SECTOR 03 |
0|
50 |
|
4 | SECTOR 04 |
49 |
50 |

No hay lectura
sucia

Universidad Nacional de Piura

|
5 | SECTOR 05 |
50 |
50 |
+----------+-------------+--------------------+-----------+
5 rows in set (0.00 sec)

Pretende realizar modificacin:


mysql> call ups_Reservar1('4');
10
mysql> select * from sector;
+----------+-------------+--------------------+-----------+
| idSector | Descripcion | CantidadReservados | Capacidad |
+----------+-------------+--------------------+-----------+
|
1 | SECTOR 01 |
50 |
50 |
|
2 | SECTOR 02 |
50 |
50 |
|
3 | SECTOR 03 |
0|
50 |
|
4 | SECTOR 04 |
50 |
50 |
|
5 | SECTOR 05 |
50 |
50 |
+----------+-------------+--------------------+-----------+
5 rows in set (0.00 sec)

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

11

mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> call ups_Reservar1('4');

Luego de haber terminado la


transaccin recin la transaccin b
podr realizar alguna operacin sobre
este registro, decimos que hasta aqu el
primer usuario ya se registro y el otro
tuvo q esperar que termine por lo tanto
hasta all ya se quedo sin asiento por
que solo haban 50.

+----------------------------------------------------------------------+
| Se ha sobrepasado la capacidad maxima. No se
completo la reservacion! |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.03 sec)mysql> commit;

LECTURA
FANTASM
A

No hay lectura
sucia

Universidad Nacional de Piura

Lectura Fantasma: En este caso dos usuarios estn utilizando el software uno de ellos realiza un cambio en la
capacidad, mientras el otro intenta leer los asientos con capacidadReservados >=30 pasajeros.
Transaccin A

Transaccin B

Ambas transacciones se ponen el nivel de aislamiento en REPEATABLE READ para comenzar sus operaciones.
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.02 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from sector where cantidadReservados>=30;


+----------+-------------+--------------------+-----------+
| idSector | Descripcion | CantidadReservados | Capacidad |
+----------+-------------+--------------------+-----------+
|
1 | SECTOR 01 |
50 |
50 |
|
2 | SECTOR 02 |
30 |
50 |
|
4 | SECTOR 04 |
50 |
50 |
|
5 | SECTOR 05 |
39 |
50 |
+----------+-------------+--------------------+-----------+
4 rows in set (0.00 sec)

mysql> set global transaction isolation level read committed;


Query OK, 0 rows affected (0.02 sec)

mysql> update sector set cantidadReservados=CantidadReservados-10 where


idSector
='4';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
6

Universidad Nacional de Piura

mysql> select * from sector where cantidadReservados>=30;


+----------+-------------+--------------------+-----------+
| idSector | Descripcion | CantidadReservados | Capacidad |
+----------+-------------+--------------------+-----------+
|
1 | SECTOR 01 |
50 |
50 |
|
2 | SECTOR 02 |
30 |
50 |
|
4 | SECTOR 04 |
40 |
50 |
|
5 | SECTOR 05 |
39 |
50 |
+----------+-------------+--------------------+-----------+
4 rows in set (0.00 sec)

Hay lectura
fantasma

mysql> select * from sector where cantidadReservados>=30;


+----------+-------------+--------------------+-----------+
| idSector | Descripcion | CantidadReservados | Capacidad |
+----------+-------------+--------------------+-----------+
|
1 | SECTOR 01 |
50 |
50 |
|
2 | SECTOR 02 |
30 |
50 |
|
4 | SECTOR 04 |
50 |
50 |
|
5 | SECTOR 05 |
39 |
50 |
+----------+-------------+--------------------+-----------+
4 rows in set (0.00 sec)

mysql>commit;
Query OK, 0 rows affected (0.00 sec)

mysql>commit;
8

Query OK, 0 rows affected (0.00 sec)

Modificacin por
cancelacin de 30
reservaciones

Universidad Nacional de Piura

Caso N 04: SERIALIZABLE


El cliente 1 (T1) y el cliente 2 (T2) desean asistir a un partido de
futbol, T1 hace la consulta para saber la cantidad de reservados menor a
50, este Select acta implcitamente como bloqueo compartido. Por
tanto T2 no podr hacer ninguna modificacin sobre los registros
consultados por T1

T1

T2

Verifica el nivel de aislamiento


mysql> select @@tx_isolation;
+--------------------+
| @@tx_isolation |
+--------------------+
| SERIALIZABLE |
+--------------------+
1 row in set (0.00 sec)

T1 inicia la transaccin
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

T1 realiza una consulta para saber


la cantidad de reservados. Este
Select acta implcitamente como
SELECT... LOCK IN SHARE MODE
(bloqueo compartido)
mysql> select * from sector where
CantidadReservados < 50 ;

+-----------+---------------+-------------------------+------------+
|idSector| Descripcion| CantidadReservados|
Capacidad|
+-----------+---------------+-------------------------+-----------+
|
3
| SECTOR 03 |
0
|
50 |
|
4
| SECTOR 04 |
49
|
50 |
+-----------+---------------+--------------------------

Universidad Nacional de Piura


+-----------+

2 rows in set (0.00 sec)

Verifica el nivel de aislamiento


mysql> select @@tx_isolation;
+--------------------+
| @@tx_isolation |
+--------------------+
| SERIALIZABLE |
+--------------------+
1 row in set (0.00 sec)

T2 inicia la transaccin
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
Lock wait
timeout
exceeded

T2 desea hacer una reservacin en


el SECTOR 3, le aparecer un
mensaje de error, ya que ese sector
forma parte del rango del Select
que hizo T1
mysql> update sector set
CantidadReservados=CantidadReservados
+2 where idSector=3;
ERROR 1205 (HY000): Lock wait timeout
exceeded; try restarting transaction
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

CONCLUSIN:

Este nivel es similar a REPEATABLE READ, pero todas las


sentencias SELECT son convertidas implcitamente a SELECT...
LOCK IN SHARE MODE.

Universidad Nacional de Piura

CONCLUSIONES

Las transacciones son el medio por el cual podemos obtener


soporte para la integridad de los sistemas que se basan o estn
ms enfocados a las operaciones transaccionales, por ejemplo
reservaciones de asientos en un estadio, como es el caso del
presente trabajo, bancos, agencias de vuelo, etc.,

Rescatemos el soporte de MySQL que le da a las BD, el motor


transaccional, en este caso InnoDB.

InnoDB

nos

ofrece

UNCOMMITTED,

cuatro

READ

niveles

COMMITTED,

de

aislamiento

REPEATABLE

READ
READ,

SERIALIZABLE los cuales sern utilizados acorde a las necesidades


de los usuarios.

Você também pode gostar