21
Tema – 9 Control de transacciones y concurrencia

T9 - Transacciones y concurrencia

Embed Size (px)

DESCRIPTION

Transacciones y concurrencia en MySQL

Citation preview

Page 1: T9 - Transacciones  y concurrencia

Tema – 9Control de transacciones y

concurrencia

Page 2: T9 - Transacciones  y concurrencia

Índice

1. Introducción2. Modo AUTOCOMMIT en MySQL3. COMMIT / ROLLBACK4. SAVEPOINT

1. Ejemplo5. Concurrencia6. Bloqueo de tablas7. Características del bloqueo de tablas8. Desbloqueo de tablas

2

Page 3: T9 - Transacciones  y concurrencia

9.1. Introducción

• Una transacción es un conjunto de operaciones DML (INSERT, UPDATE, DELETE) que se ejecutan como un único bloque, es decir, si falla una operación fallan todas.

• Si una transacción tiene éxito, todas las modificaciones de los datos realizadas durante la transacción se confirman y se convierten en una parte permanente de la base de datos.

• Si una transacción encuentra errores y debe cancelarse o revertirse, se borran todas las modificaciones de los datos.

3

Page 4: T9 - Transacciones  y concurrencia

9.1. Introducción

• El ejemplo clásico de transacción es una transferencia bancaria, en la que quitamos saldo a una cuenta y lo añadimos en otra. Si no somos capaces de abonar el dinero en la cuenta de destino, no debemos quitarlo de la cuenta de origen.

4

Page 5: T9 - Transacciones  y concurrencia

9.1. Introducción

• En MySQL toda la actividad de un usuario se realiza dentro de una transacción.

• Por defecto, MySQL viene con el modo AUTOCOMMIT activado.–Cada sentencia SQL es una transacción por

sí misma, y si no ocurre ningún problema, las actualizaciones se almacenan en disco.

5

Page 6: T9 - Transacciones  y concurrencia

9.2. 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 transacción abierta, que tendremos que terminar con las sentencias COMMIT o ROLLBACK.

6

Page 7: T9 - Transacciones  y concurrencia

9.2. 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 también podemos iniciar y terminar transacciones. Habrá que utilizar la siguiente sintaxis para indicar el inicio de una transacción:– START TRANSACTION o BEGIN.

• La transacción que hemos iniciado con START TRANSACTION o BEGIN tenemos que terminarla con un COMMIT o un ROLLBACK.

7

Page 8: T9 - Transacciones  y concurrencia

9.3. COMMIT / ROLLBACK

• La sentencia COMMIT hace que los cambios realizados en la transacción actual se conviertan en permanentes y se vuelvan visibles para el resto de usuarios

• La sentencia ROLLBACK cancela todas las modificaciones producidas en la transacción actual.

8

Page 9: T9 - Transacciones  y concurrencia

9.4. SAVEPOINT

• Los SAVEPOINT son puntos de control que se sitúan dentro de una transacción.

• Cuando se efectúa un ROLLBACK al final de una transacción, éste puede ser total (se deshacen todas las operaciones de la transacción) o hasta uno de los puntos de control de la transacción.

9

Page 10: T9 - Transacciones  y concurrencia

9.4. 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

Page 11: T9 - Transacciones  y concurrencia

9.4. SAVEPOINT

• Todos los puntos de control de la transacción 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

Page 12: T9 - Transacciones  y concurrencia

9.4.1. Ejemplo

insert into cliente values (10,'cli4','Barcelona');savepoint P1;insert into cliente values (11,'cli5','Barcelona');savepoint P2;insert into cliente values (12,'cli6','Barcelona');SELECT * FROM cliente;rollback TO P1; -- Deshacemos los insert de 'cli5' y 'cli6'SELECT * FROM cliente;rollback TO P2; /* Dará error (al haber hecho rollback a P1

desaparece P2) */commit;

12

Page 13: T9 - Transacciones  y concurrencia

9.5. Concurrencia

• La concurrencia se produce cuando varios procesos se ejecutan simultáneamente, lo que conlleva habitualmente el acceso a los mismos datos. Por tanto, hay que utilizar herramientas que eviten la inconsistencia de los datos.

13

Page 14: T9 - Transacciones  y concurrencia

9.5. Concurrencia

• Podemos prevenir la modificación 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

Page 15: T9 - Transacciones  y concurrencia

9.6. Bloqueo de tablas

• La sintaxis para bloquear tablas es la siguiente:– LOCK TABLES nombre_tabla1 READ | WRITE,

nombre_tabla2 READ | WRITE …

• La opción READ permite leer sobre la tabla, pero no escribir. La opción WRITE permite que la sesión que ejecuta el bloqueo pueda escribir sobre la tabla, pero el resto de sesiones sólo pueden leer, hasta que acabe el bloqueo.

15

Page 16: T9 - Transacciones  y concurrencia

9.6. 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

Page 17: T9 - Transacciones  y concurrencia

9.7. Características 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 línea nos dará un error

17

Page 18: T9 - Transacciones  y concurrencia

9.7. Características del bloqueo de tablas• No se puede acceder más 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; -- IncorrectoINSERT INTO t SELECT * FROM t AS t1; -- Correcto

18

Page 19: T9 - Transacciones  y concurrencia

9.7. Características 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; -- IncorrectoSELECT * FROM t AS mialias; -- Correcto

19

Page 20: T9 - Transacciones  y concurrencia

9.7. Características 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

Page 21: T9 - Transacciones  y concurrencia

9.8. Desbloqueo de tablas

• Podemos desbloquear todas las tablas que estén bloqueadas con la sentencia:– UNLOCK TABLES

• Si acaba la conexión (normal o anormalmente) antes de desbloquear las tablas, éstas se desbloquean automáticamente.

21