Your SlideShare is downloading. ×
T9 - Transacciones  y concurrencia
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

T9 - Transacciones y concurrencia

2,516
views

Published on

Transacciones y concurrencia en MySQL

Transacciones y concurrencia en MySQL

Published in: Education

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,516
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
141
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • {}
  • Transcript

    • 1. Tema – 9 Control de transacciones y concurrencia
    • 2. Índice 1. 2. 3. 4. 5. 6. 7. 8. Introducción Modo AUTOCOMMIT en MySQL COMMIT / ROLLBACK SAVEPOINT 1. Ejemplo Concurrencia Bloqueo de tablas Características del bloqueo de tablas Desbloqueo de tablas 2
    • 3. 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
    • 4. 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
    • 5. 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
    • 6. 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
    • 7. 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
    • 8. 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
    • 9. 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
    • 10. 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
    • 11. 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
    • 12. 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
    • 13. 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
    • 14. 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
    • 15. 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
    • 16. 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
    • 17. 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
    • 18. 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; -- Incorrecto INSERT INTO t SELECT * FROM t AS t1; -- Correcto 18
    • 19. 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; -- Incorrecto SELECT * FROM t AS mialias; -- Correcto 19
    • 20. 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
    • 21. 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

    ×