Vous êtes sur la page 1sur 20

Control de transacciones y

concurrencia
Introduccin
Una transaccin es un conjunto de operaciones DML
(INSERT, UPDATE, DELETE) que se ejecutan como un
nico bloque, es decir, si falla una operacin fallan
todas.
Si una transaccin tiene xito, todas las modificaciones
de los datos realizadas durante la transaccin se
confirman y se convierten en una parte permanente de
la base de datos.
Si una transaccin encuentra errores y debe cancelarse
o revertirse, se borran todas las modificaciones de los
datos.
3
Introduccin
El ejemplo clsico de transaccin es una
transferencia bancaria, en la que quitamos
saldo a una cuenta y lo aadimos en otra.
Si no somos capaces de abonar el dinero
en la cuenta de destino, no debemos
quitarlo de la cuenta de origen.
4
Introduccin
En MySQL toda la actividad de un usuario
se realiza dentro de una transaccin.
Por defecto, MySQL viene con el modo
AUTOCOMMIT activado.
Cada sentencia SQL es una transaccin por
s misma, y si no ocurre ningn problema,
las actualizaciones se almacenan en disco.
5
Modo AUTOCOMMIT en MySQL
Podemos activar y desactivar el modo
AUTOCOMMIT de la siguiente manera:
SET autocommit = 0; -- Desactivamos
SET autocommit = 1; -- Activamos
Con el AUTOCOMMIT desactivado habr
siempre una transaccin abierta, que
tendremos que terminar con las
sentencias COMMIT o ROLLBACK.
6
Modo AUTOCOMMIT en MySQL
Por tanto, con el modo AUTOCOMMIT desactivado para que
los cambios realizados en los datos sean permanentes
tendremos que realizar un COMMIT (o ROLLBACK para
deshacerlos).
Con el modo AUTOCOMMIT activado tambin podemos
iniciar y terminar transacciones. Habr que utilizar la siguiente
sintaxis para indicar el inicio de una transaccin:
START TRANSACTION o BEGIN.
La transaccin que hemos iniciado con START TRANSACTION o
BEGIN tenemos que terminarla con un COMMIT o un
ROLLBACK.
7
COMMIT / ROLLBACK
La sentencia COMMIT hace que los
cambios realizados en la transaccin
actual se conviertan en permanentes y se
vuelvan visibles para el resto de usuarios
La sentencia ROLLBACK cancela todas las
modificaciones producidas en la
transaccin actual.
8
SAVEPOINT
Los SAVEPOINT son puntos de control que se
sitan dentro de una transaccin.
Cuando se efecta un ROLLBACK al final de
una transaccin, ste puede ser total (se
deshacen todas las operaciones de la
transaccin) o hasta uno de los puntos de
control de la transaccin.
9
SAVEPOINT
Crearemos un punto de control de la
siguiente forma:
SAVEPOINT nombre_punto_control;
Si creamos un punto de control con el mismo
nombre que otro creado anteriormente, el
viejo queda substituido por el nuevo.
Para deshacer los cambios hasta un
determinado punto de control escribiremos:
ROLLBACK TO nombre_punto_control
10
SAVEPOINT
Todos los puntos de control de la transaccin
actual se borran al ejecutar un COMMIT o un
ROLLBACK (total).
Si hacemos un ROLLBACK hasta un punto de
control, los puntos de control creados
posteriormente se borran.
Podemos eliminar puntos de control con la
sentencia:
RELEASE SAVEPOINT nombre_punto_control;
11
Ejemplo
insert into clientes values (10,'cli4','Barcelona');
savepoint P1;
insert into clientes values (11,'cli5','Barcelona');
savepoint P2;
insert into clientes values (12,'cli6','Barcelona');
SELECT * FROM cliente;
rollback TO P1; -- Deshacemos los insert de 'cli5' y 'cli6'
SELECT * FROM clientes;
rollback TO P2; /* Dar error (al haber hecho rollback a P1
desaparece P2) */
commit;
12
Concurrencia
La concurrencia se produce cuando varios
procesos se ejecutan simultneamente, lo
que conlleva habitualmente el acceso a los
mismos datos. Por tanto, hay que utilizar
herramientas que eviten la inconsistencia
de los datos.
13
Concurrencia
Podemos prevenir la modificacin de
ciertas tablas, bloqueando el acceso a
stas en ciertos momentos. De esta forma,
la(s) tabla(s) bloqueada(s) no aceptar(n)
accesos de lectura o escritura de otras
sesiones.
14
Bloqueo de tablas
La sintaxis para bloquear tablas es la siguiente:
LOCK TABLES nombre_tabla1 READ | WRITE,
nombre_tabla2 READ | WRITE
La opcin READ permite leer sobre la tabla,
pero no escribir. La opcin WRITE permite que
la sesin que ejecuta el bloqueo pueda
escribir sobre la tabla, pero el resto de
sesiones slo pueden leer, hasta que acabe el
bloqueo.
15
Bloqueo de tablas
Cuando se ejecuta un LOCK TABLES se hace un
COMMIT de todas las transacciones abiertas.
Podemos bloquear todas las tablas de todas
las BBDD (por ejemplo, para realizar una copia
de seguridad) con la sentencia:
FLUSH TABLES WITH READ LOCK.
16
Caractersticas del bloqueo de
tablas
Cuando se crea un bloqueo para acceder a una
tabla, dentro de la zona de bloqueo no
podremos acceder a otras tablas hasta que no se
finalice el bloqueo:
LOCK TABLES t1 READ;
SELECT * FROM t1;
SELECT * FROM t2; -- Esta lnea nos dar un error
17
Caractersticas del bloqueo de
tablas
No se puede acceder ms de una vez a la tabla
bloqueada. Si se quiere acceder dos veces se
debe definir un alias para el segundo acceso en
el momento de hacer el bloqueo:
LOCK TABLE t WRITE, t AS t1 READ;
INSERT INTO t SELECT * FROM t; -- Incorrecto
INSERT INTO t SELECT * FROM t AS t1; -- Correcto
18
Caractersticas del bloqueo de
tablas
Si se bloquea una tabla especificando un alias,
hay que hacerle referencia con este alias, se
producir un error si intentamos acceder
directamente con su nombre:
LOCK TABLE t AS mialias READ;
SELECT * FROM t; -- Incorrecto
SELECT * FROM t AS mialias; -- Correcto
19
Caractersticas del bloqueo de
tablas
Si se quiere acceder a una tabla bloqueada con
un alias hay que definir el alias en el momento
de establecer el bloqueo:
LOCK TABLE t READ;
SELECT * FROM t AS mialias; -- Incorrecto
20
Desbloqueo de tablas
Podemos desbloquear todas las tablas que
estn bloqueadas con la sentencia:
UNLOCK TABLES
Si acaba la conexin (normal o anormalmente)
antes de desbloquear las tablas, stas se
desbloquean automticamente.
21

Vous aimerez peut-être aussi