Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Consultas de selección.
Consultas de acción o actualización.
Edición de los datos.
A las consultas que utilizan la sentencia SELECT se les denomina "Consultas de
selección". A las consultas que permiten la edición de los datos con INSERT,
Caso práctico UPDATE ó DELETE se les denomina "Consultas de actualización" o "Consultas de
acción".
Por último tendrá que asegurarse que, cuando esas modificaciones impliquen
cambios sobre una o más tablas, éstas se realicen como un bloque, es decir,
o todas o ninguna. Por ejemplo cuando se quiera recoger la factura de una
nueva reparación que implica modificar varias tablas, ¿qué pasaría si
después de añadir la fila en la tabla facturas se produce un error a la hora de
añadir las filas en realizan o incluyen, tablas que relacionan la reparación con
los recambios sustituidos o con la mano de obra? Para tratar esto Alejandra
deberá detenerse en el concepto de transacción. Ministerio de Educación y Formación Profesional (Dominio público)
Las bases de datos nos permiten almacenar datos con el propósito de poder obtener cierta
información a partir de ellos mediante la realización de consultas, como hemos visto en la
unidad anterior. Pero hay otra serie de operaciones que podemos realizar con los datos
almacenados como son las que nos permiten modificarlos, eliminarlos o bien añadir nuevos
datos. A estas operaciones se las denomina edición o tratamiento de datos. Realmente
todo son consultas que se hacen a la base de datos, y que pueden ser de dos tipos:
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 1/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 2/62
16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.
Estas herramientas facilitan las tareas cuando pretendemos realizar acciones sencillas,
tareas rutinarias o cuando el usuario no tiene conocimientos de programación, pero a lo
largo de las unidades vistas hasta el momento ya hemos podido llegar a la conclusión de Workbench (Elaboración propia)
que cuando se trata de acciones complejas en las que necesitamos tener un mayor
control de los datos que se van a alterar será necesario recurrir a nuestros
conocimientos de SQL.
Como herramientas gráficas que facilitan la edición de los datos de las tablas de una base
de datos MySQL veremos las siguientes:
Modificación de datos
Para modificar datos se procede de igual forma:
Un archivo CSV es un archivo de texto que almacena los datos en forma de
columnas, separadas por coma y las filas se distinguen por saltos de línea. Es
una forma muy sencilla de representar la información.
Son muy últiles para importar y exportar datos entre aplicaciones.
Para realizar esta tarea en modo gráfico, operamos como antes:
Podemos importar los datos almacenados en un archivo CSV a una tabla con un
diseño apropiado de columnas para almacenarlos.
Por ejemplo, vamos a importar los datos del fichero obtenido anteriormente a una
tabla de nombre equipo2 y con la misma estructura que la tabla equipo.
...
...
Otros clientes gráficos para trabajar con MySQL son Navicat y PhpMyAdmin. Tutorial de uso de PhpMyAdmin.
Te indicamos para cada uno de ellos el enlace de descarga y un enlace a un Tutorial de uso de PhpMyAdmin
turorial de uso.
Navicat.
PhpMyAdmin
WampServer
2.- Consultas de edición de datos. Actualmente no se puede modificar una tabla y seleccionar de la misma tabla en
la subconsulta. Esto se aplica a comandos tales como INSERT, REPLACE, UPDATE y
DELETE. Lo veremos en los siguientes apartados.
Caso práctico
Autoevaluación
Hasta ahora, Noiba y Vindio se han dedicado a
hacer consultas mediante la sentencia SELECT sobre Queremos añadir en la columna VEHICULOS.Modelo, el valor 'Matiz' para el
tablas que ya contenían datos. Esta operación, con vehículo de marca DAEWOO, ya que faltaba ese dato en la tabla. ¿De
ser la que se realiza con más frecuencia, no es qué tipo de consulta se trata?
suficiente para gestionar todos los movimientos que
puede registrar la información de una base de
INSERT
datos.
Según el esquema que hemos presentado en unidades anteriores, las consultas que vamos Correcto. INSERT, se utiliza para añadir filas nuevas en una tabla. Si la fila
a tratar en esta unidad corresponden al lenguaje de manipulación de datos LMD, al igual ya existe, se trata de una modificación y se utilizará UPDATE para cambiar
que la sentencia SELECT; la diferencia es que si bien hasta ahora hemos visto consultas que el valor de esa columna.
devuelven datos, las consultas que vamos a ver a continuación son consultas de acción
porque cambian los datos almacenados en las tablas. Nos referimos a las consultas INSERT,
UPDATE y DELETE.
Incorrecto. INSERT, se utiliza para añadir filas nuevas en una tabla. Si la
Veamos brevemente en qué consisten: fila ya existe, se trata de una modificación y se utilizará UPDATE para
cambiar el valor de esa columna.
SENTENCIA SIGNIFICADO
UPDATE
Se utiliza para modificar el contenido de las columnas para una o Solución
varias filas de una tabla.
Con esta sentencia se pueden eliminar una, varias o todas las filas
DELETE
de una tabla.
1. Incorrecto
TRANSACCIONES. Este concepto se ha tratado en unidades 2. Opción correcta
START
anteriores. Destacaremos que se utilizan para evitar que si en las 3. Incorrecto
TRANSACTION
consultas de acción que acabamos de ver se produce un error, la
COMMIT
base de datos pierda la integridad. Veremos en esta unidad como
ROLLBACK
trabajar con transacciones.
La sentencia INSERT permite la inserción de nuevas filas o registros en un tabla existente. Si la tabla tiene una clave principal e intentamos insertar una fila con un valor en esa
columna que ya exista, se genera un mensaje de error y la inserción no se produce.
Existen dos formas básicas de la sentencia INSERT : Cuando la tabla contiene una clave ajena relacionada con la clave de otra tabla y con
integridad referencial, si el valor que se da a la clave ajena no existe en la tabla
Añadir una fila indicando explícitamente los valores que deben tomar las columnas, o relacionada se genera error y no se produce la inserción.
Extraer las filas de una tabla ya existente y añadirlas a otra tabla (utilizando consultas Si queremos insertar una fila que tenga un índice que no admita duplicados, un valor
SELECT con INSERT). repetido en esa columna, se produce un error y no se puede insertar.
El formato más sencillo de utilización de la sentencia INSERTt iene la siguiente sintaxis:
Ejemplos.
INSERT [INTO] NombreTabla [(Columna1, [, Columna2] …..)] VALUES (Valor1 [,
Veremos a continuación algunos ejemplos de cómo utilizar la sentencia INSERT con la
Valor2] ….) , (…);
sintaxis que hemos visto:
Ejemplo 1.
Donde: Inserta una fila en la tabla RECAMBIOS rellenando todas las columnas.
INSERT INTO RECAMBIOS VALUES ('ES_222_333', 'Espejo retrovisor interior', 'Unidad', 10, 250);
Ejemplo 2.
Añade una fila en la tabla RECAMBIOS, las columnas UnidadBase y PrecioReferencia tomarán el
valor: NULL. (Si no están definidos como NOT NULL).
Ejemplo 3.
-- o también
-- 2
Como una opción más de las herramientas gráficas que venimos utilizando,
En la imagen vemos el código base para insertar una fila en la tabla EQUIPO
('11','EQUIPO11'), ('12','EQUIPO12');
Como se puede ver la cláusula VALUES se sustituye por una consulta SELECT, con
lo cual se realizan inserciones de múltiples filas en una tabla con los datos
obtenidos de otra.
En la cláusula SELECT se especifican los valores que se van a dar a las columnas de la tabla
y pueden ser tanto columnas como valores constantes. Se pueden incluir valores
entrecomillados en vez de nombres de campos, lo cual permite mezclar valores obtenidos a
partir de una tabla con constantes.
Ejemplo 1. Partimos de una tabla denominada CATALOGO donde tenemos un listado de todos
los recambios de las distintas marcas de coches. La tabla catálogo tiene la siguiente
estructura;
Añade a la tabla RECAMBIOS una fila por cada artículo de la tabla CATALOGO que contenga la
palabra 'espejo'. Los datos que no están en la tabla consultada se especifican como
constantes: UnidadBase y Stock. El precio del catálogo se incrementa en un 30%.
WHERE Descripcion LIKE '%espejo%'; Falso.La tabla RECAMBIO solo aparece una vez.
Ejemplo 2.
Añade a la tabla RECAMBIOS una fila que contiene los datos del artículo más caro del catálogo.
Esta información se obtiene mediante subconsulta. Es necesario especificar las columnas
porque no se rellenan todas.
Solución
INSERT INTO RECAMBIOS (IdRecambio, Descripcion, Stock, PrecioReferencia) SELECT Codigo, Descr
FROM CATALOGO
Reflexiona
Te recordamos que no se pueden insertar datos en una tabla y seleccionar de
la misma en una subconsulta. Ejercicio Resuelto INSERT
INTO ... SELECT
A partir de la base de datos campeonato, añade los siguientes datos:
Autoevaluación 1.- Una nueva concursante de código 'A01', nombre 'Eva Salas' y cuota
40. Su fecha de inscripción, la fecha actual.
¿Es correcta la siguiente consulta? 2.- Haz que esa concursante participe en los juegos del equipo '01'. Para
ello debes insertar los datos apropiados en la tabla participa.
INSERT INTO RECAMBIOS ( Descripcion,IdRecambio, Precio) SELECT * FROM 3.- Un nuevo juego con los siguientes datos: código 'FOR', nombre
CATALOGO ); 'Fortnite', dificultad media y del equipo '04'.
No porque no se puede poner un * en la consulta SELECT. 4.- Asigna el juego 'Fortnite' a todos los concursantes que no estén
participando en juegos. Con fecha de inicio la actual y cero puntos.
No es correcta porque no puede duplicarse la clave principal.
No es correcta. Las columnas no coinciden. Mostrar retroalimentación
Correcto. No podemos añadir el IdRecambio porque ya está en la tabla VALUES('A01', 'Eva Salas',curdate(), 40);
puede duplicar. -- 2
FROM juego
-- 3
duplicados.
SELECT cdconcur,'FOR', curdate(), 0
DUPLICATE KEY que permite modificar la fila anterior de la tabla con los
WHERE cdconcur NOT IN (SELECT cdconcur FROM participa);
Existe una sentencia para añadir filas que supone una alternativa para la sentencia INSERT.
Se trata de la sentencia REPLACE que funciona igual que INSERT excepto en el caso de
columnas PRIMARY KEY o UNIQUE.
Cuando añadimos filas con REPLACE, si un valor de la tabla coincide con el valor
que queremos insertar para un índice PRIMARY KEY o UNIQUE en la nueva fila, se
borra la fila antigua antes de insertar la nueva.
Sentencia REPLACE:
Con SELECT:
Al utilizar el comando REPLACE las filas afectadas por la consulta pueden ser:
Una sola fila si no ha necesitado eliminar ninguna fila para añadir la nueva.
Dos filas si ha necesitado eliminar una fila para añadir otra.
Autoevaluación
¿En qué se diferencian estas dos sentencias? Señala las opciones
correctas.
Mostrar retroalimentación
Solución
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 25/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 26/62
16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.
3.3.- Sentencia LOAD DATA INFILE 4.- Modificar filas: la sentencia UPDATE.
LOAD DATA LOCAL INFILE "datos_equipo.csv" INTO TABLE equipo2 LINES TERMINATED BY ‘/r/n’; UPDATE NombreTabla | CombinaciónDeTablas
[WHERE Condición ]
[ORDER BY …]
[LIMIT n]
Ejemplo 1. Que la matrícula de la tabla VEHICULOS está relacionada con la matrícula
de la tabla REPARACIONES a través de integridad referencial con
La reparación recogida con el código 10 ha finalizado. Recogemos en la tabla reparaciones
actualización en cascada, por tanto todas las reparaciones
esta situación junto a la fecha de salida del vehículo reparado, que es la fecha actual.
correspondientes a la matrícula modificada verían modificada la
matrícula.
UPDATE REPARACIONES
WHERE IdReparacion=10;
Ejemplo con tablas combinadas. El cliente Enrique Muriedas nos ha pedido que retrasemos Mostrar retroalimentación
30 días todas sus facturas.
UPDATE FACTURAS
WHERE Nombre='Enrique' AND Apellidos LIKE 'Muriedas%'; SET dificultad ='media', megusta=megusta+3
WHERE cdjuego='ELV';
-- 2
UPDATE concursante
Reflexiona -- 3
UPDATE participa
SET puntos=puntos+5
UPDATE concursante
SET cdequipo='05'
UPDATE NombreTabla
Ejemplo 1.
Bajar el precio de referencia un 5% para los recambios que no se hayan incluido en ninguna
reparación:
UPDATE RECAMBIOS
Debe seleccionar una única fila y mismo número de columnas que las que hay entre
paréntesis al lado de SET.
No puede utilizar la misma tabla que se modifica.
UPDATE NombreTabla
WHERE Condición;
Ejemplo 2.
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 31/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 32/62
16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.
Restar del stock de recambios las unidades que se han sustituido del recambio BB_000_777: reparados, es decir, que no tengan fecha de salida o que el atributo reparado
sea 0.
UPDATE RECAMBIOS
Mostrar retroalimentación
SET stock = stock - (SELECT sum(Unidades) FROM Incluyen where IdRecambio='BB_000_777')
WHERE Idrecambio='BB_000_777';
UPDATE REPARACIONES
Reflexiona
Tal como se indicó con anterioridad, en caso de que para poder realizar la
actualización de una tabla necesitemos consultar la misma tabla que se está
actualizando, MySQL daría un error ya que la tabla que se está actualizando
estaría bloqueada y no permitiría realizar consultas.
Mostrar retroalimentación
Esta sentencia de actualización daría error porque en la subconsulta aparece la tabla
concursante que es la misma que vamos a actualizar.
Entonces, ¿no se podrían realizar este tipo de sentencias? Sí se podría y la forma sería
creando una tabla temporal de la tabla que queremos consultar. Por ejemplo, en el caso
anterior se podría poner: -- 1
UPDATE juego
UPDATE concursante
-- 2
SET cuota_inscri=cuota_inscri+10
Ejercicio resuelto
En la columna Observaciones de la tabla REPARACIONES escribir el texto
'Contactar con el cliente' para aquellos vehículos que no hayan sido Para saber más
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 33/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 34/62
16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.
Caso práctico
En la gestión de la base de datos del taller mecánico,
Noiba y Naroba se han encontrado con la necesidad
de eliminar un recambio del almacén que corresponde
a un modelo de vehículo que no tiene ninguno de
nuestros clientes y que ha dejado de fabricarse.
La instrucción DELETE se utiliza para borrar filas en una o más tablas. La sintaxis para una
sola tabla es:
Ejemplo 1.
Hay que dar de baja, eliminar, los recambios cuyo stock es 0 unidades.
Debes conocer
DELET FROM recambios
Para eliminar todas las filas de una tabla podemos usar la sentencia TRUNCATE,
WHERE stock =0;
cuya sintaxis es:
Reflexiona
DROP TABLE EMPLEADOS;
Mostrar retroalimentación
Cuando hablamos de borrado de filas en una tabla tenemos que tener en cuenta
las restricciones que se hayan definido en esa tabla, si existen claves ajenas
relacionadas y si tienen establecido o no borrado en cascada, etc.
Mostrar retroalimentación
DELETE FROM juego
1.-
Al igual que antes, sí se podrían realizar estas sentencias de borrado utilizando una tabla
temporal. DELETE FROM concursante
Por ejemplo, si quisiéramos elliminar aquellos juegos con menos megusta que la media de la
media de los megusta de todos los juegos, la sentencia de borrado tendría que ser:
Tabla concursante: como este concursante es ídolo de otros
concursantes (clave foránea ON DELETE SET NULL) observa se pone a
DELETE FROM juego
NULL el cdidolo de esos concursante.
WHERE megusta <(SELECT MIN(megusta) FROM (SELECT * FROM juego) as deriv);
Tabla participa: en esta tabla el código de un concursante es clave
ajena con ON DELETE CASCADE, lo que implica que al eliminar al
consursante Ismael Rojo de código 'A33' se eliminarán en cascada
todas las filas que huiera de él en la tabla participa.
3.-
La sentencia DELETE en MySQL El sistema arroja un error de borrado haciendo referencia a claves
foráneas, el motivo es el siguiente: este equipo tiene su código como
clave ajena de las tablas concursante y juego con la restricción ON
DELETE RESTRICT, lo que implica que no se podrá eliminar un equipo si
tiene filas relacionadas en alguna de esas tablas; y resulta que el
equipo 'Los rebeldes' tiene filas relacionadas en esas tablas.
Una transacción que cambia el contenido de una base de datos debe modificarla
de un estado consistente a otro. Un estado de una base de datos consistente es
cuando se satisfacen todas las restricciones de integridad de los datos.
Algunas órdenes SQL llevan implícita la finalización de una transacción. En general esto
ocurre con todas las instrucciones que pertenecen al LDD como crear, modificar y borrar
tablas, bases de datos, índices, etc.
Solución
A continuación se listan los nombres de las sentencias de MySQL que provocan la
finalización de una transacción:
ALTER FUNCTION, ALTER PROCEDURE, ALTER TABLE, BEGIN, CREATE DATABASE, CREATE FUNCTION, 1. Incorrecto
CREATE INDEX, CREATE PROCEDURE, CREATE TABLE, DROP DATABASE, DROP FUNCTION, DROP INDEX, 2. Opción correcta
DROP PROCEDURE, DROP TABLE, LOAD MASTER DATA, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, 3. Incorrecto
START TRANSACTION, TRUNCATE TABLE, UNLOCK TABLES. 4. Incorrecto
Autoevaluación
¿Qué ocurre en nuestra base de datos si añadimos una fila en la tabla
REPARACIONES referente a un vehículo que no hemos registrado y tampoco
a su propietario?
ROLLBACK;
-- comprobación
Por defecto MySQL trabaja con el modo AUTOCOMMIT activado. Si utilizas tablas
SELECT * FROM juego;
InnoDB y quieres trabajar con transacciones de forma permanente puedes
desactivar este modo poniendo:
SET AUTOCOMMIT=0;
Ejemplo 2.
COMMIT;
Prueba ahora esta transacción con un punto de salvaguarda o restauración. Comprobarás
Como habrás observado es necesario confirmar o ignorar los cambios que que se ha podido deshacer hasta el punto de restauración.
realizados.
use campeonato;
Aunque trabajes en modo AUTOCOMMIT=ON (AUTOCOMMIT activado), puedes trabajar con START TRANSACTION;
transacciones temporalmente. Los pasos para usar transacciones en MySQL son los DELETE FROM juego
SAVEPOINT sp1;
1.- Iniciar una transacción usando la sentencia BEGIN o START TRANSACTION. INSERT INTO juego VALUES('MIT', 'Mi Transacción', 'alta',1,'01');
2.- Realizar las operaciones de actualizar, insertar o eliminar filas de la base de datos. ROLLBACK TO SAVEPOINT sp1;
3.- Si se quieren validar los cambios en la base de datos usamos COMMIT para COMMIT;
ROLLBACK para cancelar todos los cambios que se hayan realizado hasta ese momento. SELECT * FROM juego;
Autoevaluación
La sentencia:
Ejercicio Resuelto
UPDATE RECAMBIOS SET Stock=Stock+2 WHERE IdRecambio='BJ_111_666';
Se ejecuta con el modo AUTO_COMMIT desactivado. ¿Se puede deshacer? Transacciones
La sentencia UPDATE no se puede deshacer.
1.- Crea una base de datos, llamada transa, ccon una sola tabla llamada
No, es necesario activar AUTO_COMMIT. tabla1, que tenga una única columna de tipo entero llamada colum1.
Inserta en ella tres registros cualesquiera.
Sí, con ROLLBACK. 2.- Asegúrate que el modo AUTOCOMMIT está activado (para ello puedes
ejecutar el comando SHOW VARIABLES LIKE 'autocommit';).
3.- A continuación, comienza una transacción que incremente en 10 el
Incorrecto. En modo transacción la sentencia no se ejecuta si no se valor de al columna colum1 en todos los registros, y que inserte un nuevo
confirma. registro. Confirma la transacción y visualiza el nuevo contenido de la
tabla.
4.- Inicia una nueva transacción que inserte dos nuevos registros en la
No es correcto. Con AUTO_COMMIT desactivado los cambios no se ejecutan tabla y que incremente en 100 el valor de todos los registros. En este
realmente si no se confirman. caso la transacción no se confirmará, sino que se deshará. Visualiza el
contenido actual de la tabla.
5.- Ahora inicia una nueva transacción. Seguidamente, crea una
No es la opción correcta. Si activamos AUTO_COMMIT los cambios se segunda tabla, llamada tabla2, con un solo campo de tipo carácter.
ejecutan automáticamente. Inserta en la tabla dos registros. Por último, cancela la operación para
que no se efectúen estas operaciones, y comprueba si se ha creado la
tabla y se han insertado los registros en la misma. ¿Se ha podido
cancelar la operación?
Cierto. Con AUTO_COMMIT desactivado una sentencia UPDATE se puede 6.- Por último, comienza una nueva transacción. Elimina la base de
deshacer. datos transa. Intenta deshacer la operación. Comprueba si se ha
eliminado la base de datos del servidor.
Mostrar retroalimentación
use transa;
START TRANSACTION;
Durabilidad.- Los cambios que produce una transacción una vez finalizada son
INSERT INTO tabla1 VALUES(100);
usuarios, el mismo elemento de datos que está siendo utilizado por una transacción
no puede ser utilizado por otra hasta que la anterior termine. Esto se traduce en que
-- 4
los cambios que produce una transacción no sean visibles por las demás hasta que
START TRANSACTION;
siguiente.
ROLLBACK;
En esta imagen de la configuración del servidor MySQL obtenida del programa MySQL
-- 5
colum2 CHAR
);
ROLLBACK;
SHOW TABLES;
-- 6
START TRANSACTION;
ROLLBACK;
SHOW DATABASES;
Autoevaluación
Relaciona los conceptos siguientes con su significado:
Ejercicio de relacionar
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 49/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 50/62
16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.
3
Cada transacción es una unidad indivisible.
Caso práctico
Durabilidad
Aunque con el uso de transacciones en las consultas
4 Una transacción finalizada produce cambios de edición, Noiba y sus compañeros se aseguran de
Aislamiento permanentes. que las operaciones de modificación de los datos se
ejecuten completamente o no se ejecuten, este no es el
Enviar único problema que puede hacer perder la consistencia
de una base de datos como TalleresFaber.
Todas estas propiedades pretenden evitar problemas derivados del
acceso de varias transacciones a los mismos datos. Son varias las personas que van a acceder a los datos
almacenados una vez que la base de datos esté en
explotación: personal de administración, la encargada
de recambios, etc.
¿Qué ocurriría si una persona de administración intenta Alain Bachellier (CC BY-NC-
modificar el precio de un recambio mientras la SA)
Cuando una base de datos está diseñada para que la utilice un solo usuario no se nos
presenta el problema de que dos transacciones intenten acceder a la vez a los mismos
datos, pero en su mayoría, las bases de datos se diseñan para múltiples usuarios y esto
origina que se puedan dar transacciones concurrentes múltiples. Por eso el SGBD debe
disponer de controles que garanticen la consistencia y la integridad de la base de datos.
Dirty Read - Se produce cuando una transacción modifica los datos y otra transacción los
lee antes de que la primera transacción termine.
Non Repeatable.- Una transacción lee un dato, otra lo modifica y termina. Si la primera
transacción intenta leer ese dato que ha sido modificado o borrado, obtiene un valor
distinto. Dos lecturas de la misma transacción sobre el mismo dato producen resultados
diferentes.
Phantom.- Mientras una transacción se está ejecutando, otra añade una fila, que es leída
por la primera transacción. Dos lecturas de la misma transacción, sobre la misma tabla,
producen resultados diferentes.
De los problemas que acabamos de ver se obtienen 4 niveles de aislamiento para una
base de datos:
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 51/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 52/62
16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.
Mostrar retroalimentación
Como estás viendo, estos problemas se producen porque las operaciones en una
transacción se ejecutan en serie y éstas no se pueden hacer en cualquier orden cuando
operan sobre los mismos datos o sobre datos relacionados.
Autoevaluación
¿Cuáles de las siguientes operaciones crees que pueden ser conflictivas
con relación al control de concurrencia?
Transacciones
a Lectura Lectura
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 53/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 54/62
16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.
Por tanto, si una transacción necesita actualizar el dato (escribir) se emite un bloqueo
exclusivo. Los bloqueos compartidos permiten que varias transacciones lean a la vez el
7.1.- Políticas de bloqueo I. mismo elemento de datos.
Bloqueo binario:
Es la forma más simple de bloquear, ya que en este método cada transacción debe solicitar
el bloqueo del elemento que vaya a utilizar antes de acceder a él mediante una operación
de bloquear y liberar todos los bloqueos mediante una operación de desbloquear para que Autoevaluación
otra transacción los pueda utilizar.
Se denomina bloqueo binario porque tiene solo dos estados bloqueado (1) o desbloqueado Contesta si la siguiente afirmación es verdadera o falsa.
(0).
Si una transacción tiene un bloqueo compartido sobre una fila entonces:
La implementación de este método es muy simple, basta con mantener una tabla que
Una solicitud de bloqueo exclusivo de otra transacción no podrá ser
indique qué partes de los datos están bloqueados y por qué transacción, además estas
atendida inmediatamente
operaciones son programadas y manejadas por el SGBD y el usuario no tiene que
Una solicitud de bloqueo compartido de otra transacción si podrá ser
preocuparse. Cada SGBD tiene un mecanismo de bloqueo predeterminado.
atendida inmediatamente. En consecuencia ambas transacciones
mantendrán un bloqueo compartido sobre la fila.
Los bloqueos binarios son demasiado restrictivos porque bloquean incluso las Verdadero Falso
operaciones que no son conflictivas porque no actualizan datos.
Verdadero
Si el bloqueo es compartido se pueden realizar dos operaciones de
Bloqueo compartido/exclusivo: lectura simultáneamente sobre los mismos datos. Únicamente las
operaciones de escritura requieren bloqueo exclusivo.
Este método es menos restrictivo porque permite la compatibilidad de algunos bloqueos.
Bloqueo exclusivo: cuando el objeto sólo es accesible para la transacción que lo bloqueó.
Se utiliza cuando al menos una de las operaciones de la transacción es de escritura.
Bloqueo compartido: cuando todas las transacciones concurrentes son sólo de lectura.
Una fase de contracción: la transacción libera todos los bloqueos y no puede obtener
uno nuevo.
7.2.- Políticas de bloqueo II.
Ninguna operación de desbloqueo puede preceder a una operación de bloqueo en la misma
transacción. Algo que, como vemos, no se cumple en el ejemplo anterior.
Comenzamos viendo el bloqueo en dos fases.
Bloqueo de dos fases. Puede ocurrir que durante la fase de expansión más de una transacción esté
interesada en los mismos datos y por tanto ambas transacciones esperan a que
Si tenemos dos transacciones ejecutándose sobre los mismos elementos, puede darse la la otra desbloquee esos elementos, sin avanzar.
siguiente situación:
Leer X
Ejemplo: si tenemos dos transacciones que quieren acceder a los elementos X e Y puede
10
Desbloquear darse el siguiente caso:
X
Bloquear X
Puntos muertos.
Leer X
Escribir 11=10+1>
.... .....
X=X+1
(el último valor de X leído por la transacción 2 era
Desbloquear 10)
X Este caso únicamente puede darse cuando uno de los bloqueos es exclusivo.
El problema es que el dato debería haberse incrementado dos veces y sólo lo ha hecho Existen 3 técnicas básicas para controlar los puntos
una. El acceso exclusivo a un elemento mediante bloqueo no garantiza que las operaciones muertos:
se realicen correctamente. Es necesario un mecanismo que controle la liberación y
adquisición de bloqueos. Prevención de puntos muertos: cuando sea
previsible que una transacción que solicita un
El bloqueo en dos fases define de qué forma las transacciones van a adquirir y ceder los bloqueo pueda producir un punto muerto, la
bloqueos garantizando la serialización. Este sistema fuerza a las transacciones a realizar transacción es abortada y todos los bloqueos que
primero todas las operaciones de adquisición de bloqueos antes de la primera operación de haya obtenido se liberan. La transacción se Guindo (CC BY-NC-SA)
desbloqueo. reprograma de nuevo evitando las condiciones que
producen puntos muertos.
Estas dos fases son: Detección de puntos muertos: el SGBD comprueba periódicamente la existencia de
puntos muertos y si lo encuentra, una de las transacciones es reiniciada.
Una fase de expansión: en esta fase la transacción adquiere todos los bloqueos hasta Evitar los puntos muertos: que la transacción requiera que todos los bloqueos se
que esté en su punto bloqueado. Hasta que la transacción no tenga todos los obtengan en sucesión, aunque esto incrementa los tiempos de respuesta de las
bloqueos no se modifica ningún dato. acciones.
UNLOCK TABLES
NombreTabla1, NombreTabla2, ... Una o más tablas separadas por comas. Para cada tabla se
puede definir el tipo de bloqueo:
READ: bloqueo de sólo lectura. Esto bloquea a otros usuarios que quieran escribir en la
tabla, pero les permitiría leerla. Es un bloqueo compartido.
WRITE: bloqueo de escritura. Bloquea a otros usuarios impidiéndoles el acceso, tanto
para leer como para escribir. Es un bloqueo exclusivo.
LOW PRIORITY WRITE: por defecto las operaciones de escritura tienen prioridad sobre las
de lectura, por tanto si llega una petición de escritura se ejecutará antes que una de
lectura (si una operación de lectura está iniciada primero terminará esta). Cuando se
establece LOW_PRIORITY WRITE, una operación de escritura no tiene prioridad, sólo
cuando no haya operaciones de lectura en espera se realizará la operación de
escritura.
AS Alias: permite bloquear una tabla múltiples veces en una consulta bloqueando los
alias.
UNLOCK TABLES libera cualquier bloqueo realizado por la transacción actual. Las tablas se
liberan cuando la transacción realiza otro LOCK TABLES o cuando se cierra la conexión con el
servidor.
De forma adicional, InnoDB permite también que haya simultáneamente bloqueos de filas y
UPDATE CLIENTES
En cuanto a la posibilidad de puntos muertos (deadlocks), cuando InnoDB lo detecta WHERE CodCliente='00009';
cancela automáticamente una o más transacciones, generalmente las más pequeñas. Esto
funciona así cuando las tablas son InnoDB y el bloqueo es a nivel de fila. Si lo hemos
cambiado con la sentencia LOCK TABLE no detecta los puntos muertos. Como verás la operación se ejecuta correctamente.
Para usar LOCK TABLES con tablas InnoDB debemos tener AUTOCOMMIT=0 y no desbloquear las Para finalizar queda deshacer la transacción y desbloquear las tablas.
tablas con UNLOCK TABLES hasta que hayamos confirmado (COMMIT) la transacción. No es
conveniente utilizarlo con este tipo de tablas porque InnoDB utiliza de forma automática el
bloqueo a nivel de filas y se pueden dar fácilmente puntos muertos (deadlocks).
ROLLBACK;
UNLOCK TABLES;
Desde MySQL Workbench desactiva el modo AUTOCOMMIT y escribe el código Si quieres saber más sobre bloqueo de tablas en MySQL puedes acceder al
para bloquear CLIENTES para escritura: manual desde los siguientes enlaces:
UPDATE CLIENTES
SET Nombre='José'
WHERE CodCliente='00009';
¿Qué ocurre? Esta operación se mantiene a la espera porque esa tabla está
bloqueada.