BD05 Vi
BD05 Vi
BD05 Vi
Caso práctico
Por supuesto, al ser una aplicación online, distintos usuarios podrán realizar
operaciones simultáneamente, como crear partidas al mismo tiempo.
Aviso Legal
1 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
1.- Introducción.
Caso práctico
Pero la información no se puede almacenar en la base de datos sin tener en cuenta que
debe seguir una serie de requisitos en las relaciones existentes entre las tablas que la
componen. Todas las operaciones que se realicen respecto al tratamiento de los datos
deben asegurar que las relaciones existentes entre ellos se cumplan correctamente en todo
momento.
Por otro lado, la ejecución de las aplicaciones puede fallar en un momento dado y eso no
debe impedir que la información almacenada sea correcta. O incluso el mismo usuario de
las aplicaciones debe tener la posibilidad de cancelar una determinada operación, y dicha
cancelación no debe suponer un problema para que los datos almacenados se encuentren
en un estado fiable.
Todo esto requiere disponer de una serie de herramientas que aseguren esa fiabilidad de la
información, y que además puede ser consultada y manipulada en sistemas
2 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
multiusuario sin que las acciones realizadas por un determinado usuario afecte
negativamente a las operaciones de los demás usuarios.
3 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Caso práctico
Para realizar el tratamiento de los datos en línea de comandos se Everaldo Coelho (GNU/GPL)
requiere la utilización de un lenguaje de base de datos como SQL, lo
cual implica el conocimiento de dicho lenguaje.
4 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
En el SGBD Mysql podemos encontrar una herramienta similar, aunque menos potente:
phpmyadmin.
Debes conocer
En el siguiente enlace puedes acceder a un PDF de un manual breve y
sencillo del uso básico de SQLDeveloper en español. Te será útil para el
seguimiento de la unidad.
Autoevaluación
La única manera de realizar el tratamiento de datos en una base de
datos es a través de una herramienta gráfica. ¿Verdadero o Falso?
Falso.
Verdadero.
Solución
5 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
1. Opción correcta
2. Incorrecto
6 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Para finalizar, cuando hayas insertado todas las filas, confirma la operación con el botón
correspondiente . Se visualizará un mensaje en la parte inferior de la pantalla
En caso de que se haya producido un error al intentar insertar los datos, habrá que
comprobar el mensaje que se muestra, e intentar solucionar el problema. Por ejemplo, si se
intenta introducir un texto en un campo de tipo numérico se obtendrá un error como el
siguiente: "error ORA-00984: columna no permitida aquí", y no se habrá realizado ninguna
operación de la inserción del nuevo registro.
Debes conocer
Para deshacer una operación de inserción, modificación o borrado de filas
7 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
lado del botón de confirmación. Ten en cuenta que si ya has confirmado los
cambios no podrás deshacerlos. Tampoco podrás deshacerlos si has
realizado una operación DDL, ya que éstas se confirman de forma
automática.
8 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Para finalizar, cuando hayas realizado todas las modificaciones, confirma la operación con
el botón correspondiente Botón de confirmación de transacción en SQLDeveloper. Se
muestra el símbolo de verificación verde sobre la representación del símbolo de la BD . Se
visualizará un mensaje en la parte inferior de la pantalla indicando Confirmación Correcta si
las filas se han modificado de forma correcta.
9 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
10 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Para que los cambios se apliquen y se realice el borrado efectivo de las filas, al igual que
en las operaciones de inserción y modificación, debes confirmar con el botón .
Recuerda que puedes deshacer los borrados, antes de confirmar, con el botón .
11 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Caso práctico
El lenguaje SQL dispone de una serie de sentencias para la edición (inserción, actualización
y borrado) de los datos almacenados en una base de datos. Ese conjunto de sentencias
recibe el nombre de Data Manipulation Language (DML).
Como ya sabemos las sentencias SQL pueden ser ejecutadas desde la línea de comandos
de SQLPlus o escribiéndolas en la Hoja de trabajo de SQLDeveloper.
Para trabajar con SQLDeveloper utiliza el botón . Solicitará la conexión con la que
queremos trabajar, pudiendo seleccionarla desde la lista desplegable asociada. Una vez
elegida, se abrirá en la pantalla la Hoja de trabajo desde donde podremos introducir las
sentencias SQL. Para ejecutar las sentencias SQL utiliza el botón situado en la parte
12 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
13 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
14 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Donde nombre_tabla será el nombre de la tabla en la que quieras añadir nuevos registros.
En lista_campos se indicarán los campos de dicha tabla en los que se desea escribir los
nuevos valores indicados en lista_valores. Es posible omitir la lista de campos
(lista_campos), si se desea cambiar todos los valores de cada campo y en el orden en el
que se encuentran en la tabla.
Para poder probar los ejemplos debes tener creadas y cargadas las tablas de JuegosOnline en
el usuario c##juegos o similar. Si no lo has hecho en la unidad anterior, descárgate el script de
este enlace, conecta con sys as sysdba y a continuación ejecútalo. Recuerda que si lo haces
desde sqlplus solo tienes que escribir la ruta y el nombre del script precedido del símbolo
@ o bien de la palabra start.
INSERT INTO USUARIOS (Login, Password, Nombre, Apellidos, Direccion, CP, Localidad, Provincia,
F_Ing, Correo, Credito, Sexo) VALUES ('migrod86', '6PX5=V', 'MIGUEL ANGEL', 'RODRIGUEZ RODRIGUEZ'
'ARCO DEL LADRILLO,PASEO', '47001', 'VALLADOLID', 'VALLADOLID', 'ESPAÑA', '27/04/1977', '10/01/2008'
En este otro ejemplo, se inserta un registro de igual manera, pero sin disponer de todos los
datos:
15 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
INSERT INTO USUARIOS (Login, Password, Nombre, Correo) VALUES ('caysan56', 'W4IN5U', 'CAYETANO'
Autoevaluación
¿Cuál de las siguientes sentencias INSERT es correcta?
INSERT INTO PRODUCTOS (Codigo, Nombre, Existencias) VALUES (3, Leche, 100);
INSERT INTO PRODUCTOS (Codigo, Nombre, Existencias) VALUES (3, 'Leche', 100);
Solución
16 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
1. Incorrecto
2. Incorrecto
3. Opción correcta
4. Incorrecto
17 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
En este otro ejemplo puedes ver la actualización de dos campos, poniendo a 0 el crédito y
poniendo a Nulos la información del campo f_nac de todos los usuarios:
Para que los cambios afecten a determinados registros hay que especificar una condición.
Por ejemplo, si se quiere cambiar el crédito de todas las mujeres, estableciendo el valor
300:
9 fila(s) actualizada(s).
18 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
19 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Al igual que hemos visto en las sentencias anteriores, nombre_tabla hace referencia a la
tabla sobre la que se hará la operación, en este caso de borrado. Se puede observar que la
cláusula WHERE es opcional. Si no se indica, debes tener muy claro que se borrará todo el
contenido de la tabla, aunque la tabla seguirá existiendo con la estructura que tenía hasta
el momento. Por ejemplo, si usas la siguiente sentencia, borrarás todos los registros de la
tabla USUARIOS:
Para ver un ejemplo de uso de la sentencia DELETE en la que se indique una condición,
supongamos que queremos eliminar todos los usuarios cuyo crédito es cero:
Autoevaluación
¿Si no se especifica una condición en la sentencia DELETE se borra todo
el contenido de la tabla especificada?
Verdadero.
Falso.
20 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Solución
1. Opción correcta
2. Incorrecto
21 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Caso práctico
Dos tablas pueden ser relacionadas entre ellas si tienen en común uno o más campos, que
reciben el nombre de clave ajena. La restricción de integridad referencial requiere que
haya coincidencia en todos los valores que deben tener en común ambas tablas. Cada
valor del campo que forma parte de la integridad referencial definida, debe corresponderse,
en la otra tabla, con otro registro que contenga el mismo valor en el campo referenciado.
Siguiendo con el ejemplo de juegos online, supongamos que en una determinada partida
de un juego, se han unido una serie de usuarios. En la tabla de PARTIDAS existe un campo de
referencia al tipo de juego al que corresponde, mediante su código de juego. Por tanto, no
puede existir ninguna partida cuyo código de juego no se corresponda con ninguno de los
juegos de la tabla JUEGOS.
Para que se cumpla la integridad referencial, todos los valores del campo Cod_Juego de la
tabla PARTIDAS deben corresponderse con valores existentes en el campo Codigo de la tabla
JUEGOS.
22 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Integridad Referencial
23 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Si se modifica el valor de la clave ajena en la tabla hija, debe establecerse un nuevo valor
que haga referencia a la clave principal de uno de los registros de la tabla padre. De la
misma manera, no se puede modificar el valor de la clave principal en un registro de la
tabla padre, si una clave ajena hace referencia a dicho registro.
El código del juego "DAMAS" no puede ser cambiado, ya que hay registros en la tabla
PARTIDAS que hacen referencia a dicho juego a través del campo Cod_Juego.
24 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
25 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Y podremos elegir la opción en la lista desplegable del cuadro "Al suprimir" como se
muestra en la siguiente imagen.
Si se quieren realizar estas operaciones con código SQL, se dispone de las siguientes
opciones durante la declaración de la clave ajena de la tabla: utilizar la opción ON DELETE
CASCADE para hacer la supresión en cascada, o bien ON DELETE SET NULL si se prefiere definir
26 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
CONSTRAINT JUEGOS_CON FOREIGN KEY (Cod_Juego) REFERENCES JUEGO (Codigo) ON DELETE CASCADE;
Hay que recordar que una declaración de este tipo debe hacerse en el momento de crear la
tabla (CREATE TABLE) o modificar su estructura (ALTER TABLE).
27 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Caso práctico
Para conseguir esto no le sirven las sentencias SQL simples que has podido
ver en apartados anteriores. Deberá utilizarlas en unión con consultas que
determinen los registros que han de ser modificados.
Anteriormente has podido conocer una serie de instrucciones del lenguaje SQL que han
servido para realizar operaciones de inserción, modificación y eliminación de registros. Tal
como las hemos analizado, esas operaciones se realizan con una sola tabla, pero vamos a
ver que esas mismas sentencias pueden utilizarse de una forma más avanzada insertando
consultas dentro de esas mismas operaciones de tratamiento de datos.
Por tanto, veremos que una tabla se puede ver afectada por los resultados de las
operaciones en otras tablas, es decir, que con una misma instrucción se puede añadir más
de un registro a una tabla, o bien actualizar o eliminar varios registros basados en otras
consultas
Los valores que se añadan o se modifiquen podrán ser obtenidos como resultado de una
consulta.
Además, las condiciones que hemos podido añadir hasta ahora a las sentencias, pueden
ser también consultas, por lo que pueden establecerse condiciones bastante más
complejas.
28 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
En este manual pueden encontrar una sección sobre las funciones agregadas
y subconsultas (módulo 3). También puedes ver ejemplos en la parte final.
29 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Esta misma acción se puede realizar usando una consulta SELECT dentro de la sentencia
INSERT, así por ejemplo, la equivalente a la anterior sería:
Puedes observar que simplemente se ha sustituido el nombre de la tabla, junto con sus
campos, por una consulta equivalente.
También es posible insertar en una tabla valores que se obtienen directamente del
resultado de una consulta. Supongamos por ejemplo, que disponemos de una tabla
USUARIOS_SIN_CREDITO con la misma estructura que la tabla USUARIOS ya creada. Si queremos
insertar en esa tabla todos los usuarios que tienen el crédito a cero:
Observa que en ese caso no se debe especificar la palabra VALUES, ya que no se está
especificando una lista de valores.
Se puede crear una tabla e insertar datos a partir de una consulta. Podemos crear la
tabla USUARIOS_CON_CREDITO partiendo de la tabla usuario, si queremos crearla exactamente
con el mismo número de campos y con su contenido pondremos:
30 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Si queremos crear una tabla USUARIAS con la misma estructura, pero sin contenido
especificaremos una condición que no se cumpla nunca y así ningún registro se copiará:
Autoevaluación
¿Cuál de las siguientes sentencias INSERT es la correcta para insertar en
la tabla CLIENTES los nombres de los registros de la tabla
NUEVOS_CLIENTES, suponiendo que los campos que contienen los
nombres se llaman Nombre_CLI en la tabla CLIENTES y Nombre_NCLI en
la tabla NUEVOS_CLIENTES?
INSERT INTO CLIENTES (Nombre_CLI) VALUES Nombre_NCLI FROM NUEVOS_CLIENTES;
¡Muy bien!
31 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Solución
1. Incorrecto
2. Opción correcta
3. Incorrecto
4. Incorrecto
32 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Autoevaluación
¿Cuál de las siguientes sentencias UPDATE es la correcta para actualizar
en la tabla USUARIOS el crédito del usuario con código 3 para asignarle
el mismo crédito que el del usuario con código 5?
UPDATE USUARIOS SET Credito = Credito WHERE Codigo = 3 AND WHERE Codigo = 5;
UPDATE USUARIOS SET Credito = (SELECT Credito FROM USUARIOS WHERE Codigo = 3
AND WHERE Codigo = 5);
UPDATE USUARIOS SET Codigo = 5 WHERE (SELECT Credito FROM USUARIOS WHERE
Codigo = 3);
UPDATE USUARIOS SET Credito = (SELECT Credito FROM USUARIOS WHERE Codigo = 3)
WHERE Codigo = 5;
¡Muy bien!
33 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Solución
1. Incorrecto
2. Incorrecto
3. Incorrecto
4. Opción correcta
34 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
DELETE FROM (SELECT LOGIN, PROVINCIA FROM USUARIOS, UNEN WHERE CODIGO_USUARIO=LOGIN) WHERE PROVINCIA
Autoevaluación
¿Cuál de las siguientes sentencias DELETE es la correcta para eliminar de
la tabla USUARIOS todos aquellos cuyo código se encuentra en una
tabla llamada ANTIGUOS?
DELETE FROM USUARIOS WHERE Codigo IN (SELECT Codigo FROM ANTIGUOS);
DELETE FROM (SELECT Codigo FROM ANTIGUOS) WHERE Codigo IN (SELECT Codigo
FROM USUARIOS);
¡Muy bien!
35 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Solución
1. Opción correcta
2. Incorrecto
3. Incorrecto
4. Incorrecto
36 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
6.- Transacciones.
Caso práctico
Una transacción es una unidad atómica (no se puede dividir) de trabajo que
contiene una o más sentencias SQL. Las transacciones agrupan sentencias
SQL de tal manera que a todas ellas se le aplica una operación COMMIT, que
podríamos traducir como confirmadas, aplicadas o guardadas en la base de
datos, o bien a todas ellas se les aplica la acción ROLLBACK, que interpretamos
como deshacer las operaciones que deberían hacer sobre la base de datos.
37 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Para evitar situaciones de estas se utilizan las transacciones, de forma que las 4
operaciones sean consideradas como una única operación y, o se realizan las 4, o no se
realiza ninguna, es decir, hasta que no estén las 4 realizadas, no se confirma (COMMIT) la
operación. Si hay problemas antes de que se realicen las 4, se deshacen (ROLLBACK) las
operaciones hechas que han dejado a medias el proceso.
Mientras que sobre una transacción no se haga COMMIT, los resultados de ésta pueden
deshacerse. El efecto de una sentencia del lenguaje de manipulación de datos (DML) no es
permanente hasta que se hace la operación COMMIT sobre la transacción en la que esté
incluida, o hasta que se ejecuta una operación DDL.
Las transacciones de Oracle cumplen con las propiedades básicas de las transacciones en
base de datos:
Las sentencias de control de transacciones gestionan los cambios que realizan las
sentencias DML y las agrupa en transacciones. Estas sentencias te permiten realizar las
siguientes acciones:
38 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Utilizar la sentencia COMMIT, la cual ordena a la base de datos que haga permanentes
las acciones incluidas en la transacción.
Ejecutar una sentencia DDL (como CREATE, DROP, RENAME, o ALTER). La base de datos
ejecuta implícitamente una orden COMMIT antes y después de cada sentencia DDL.
Si el usuario cierra adecuadamente las aplicaciones de gestión de las bases de datos
Oracle, se produce un volcado permanente de los cambios efectuados por la
transacción.
Para que los cambios se puedan deshacer con ROLLBACK es necesario que la variable de
confirmación (AUTOCOMMIT) esté a OFF. Si está con el valor ON cada sentencia se confirmará
tras su ejecución.
39 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Autoevaluación
¿Si se cierra correctamente la aplicación gráfica después de haber
realizado una operación de modificación de datos, y no se ha indicado la
opción de Confirmación automática, ni se ha ejecutado la sentencia
COMMIT, se quedan guardados los cambios efectuados por la
transacción?
Verdadero.
Falso.
Solución
1. Opción correcta
2. Incorrecto
40 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
ROLLBACK;
Hay que tener en cuenta que si una transacción termina de forma anormal, por ejemplo,
por un fallo de ejecución, los cambios que hasta el momento hubiera realizado la
transacción son deshechos de forma automática.
Autoevaluación
¿Se pueden deshacer los cambios con la sentencia ROLLBACK después de
que se haya ejecutado COMMIT?
Verdadero.
Falso.
Solución
41 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
1. Incorrecto
2. Opción correcta
Ejemplo de Rollback
42 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
SAVEPOINT nombre_punto_restauración;
La restauración de los cambios hasta ese punto se hará con un comando con el siguiente
formato:
Savepoint
Control transacciones
43 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Caso práctico
Ana tiene una duda que le quiere preguntar a
Juan, ya que se ha estado planteando qué
ocurre en el supuesto caso de que dos
operaciones simultáneas modifiquen un
mismo registro. Por ejemplo, si se ofrece la
posibilidad de que se puedan transferir
créditos de un usuario a otro, qué ocurriría si
justo en un mismo momento dos usuarios le
Ministerio de Educación (Uso educativo nc)
regalan crédito a un tercero. ¿Podría ocurrir
que sólo llegara a realizarse una de las dos
operaciones?
44 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
datos, incluyendo los cambios visibles realizados por las transacciones del mismo
usuario y las transacciones finalizadas de otros usuarios.
En una base de datos monousuario, no son necesarios los bloqueos ya que sólo modifica
la información un solo usuario. Sin embargo, cuando varios usuarios acceden y modifican
datos, la base de datos debe proveer un mecanismo para prevenir la modificación
concurrente del mismo dato. Los bloqueos permiten obtener los siguientes requerimientos
fundamentales en la base de datos:
Consistencia: Los datos que están siendo consultados o modificados por un usuario
no pueden ser cambiados por otros hasta que el usuario haya finalizado la operación
completa.
Integridad: Los datos y sus estructuras deben reflejar todos los cambios efectuados
sobre ellos en el orden correcto.
45 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Hay dos mecanismos para el bloqueo de los datos en una base de datos: bloqueo
pesimista y bloqueo optimista. En el bloqueo pesimista de un registro o una tabla se
realiza el bloqueo inmediatamente, en cuanto el bloqueo se solicita, mientras que en un
bloqueo optimista el acceso al registro o la tabla sólo está cerrado en el momento en que
los cambios realizados a ese registro se actualizan en el disco. Esta última situación sólo es
apropiada cuando hay menos posibilidad de que alguien necesite acceder al registro
mientras está bloqueado, de lo contrario no podemos estar seguros de que la actualización
tenga éxito, porque el intento de actualizar el registro producirá un error si otro usuario
actualiza antes el registro. Con el bloqueo pesimista se garantiza que el registro será
actualizado.
Autoevaluación
Supongamos que un usuario está en proceso de modificación de un
registro, y otro en ese mismo momento quiere leer ese mismo registro.
¿Qué tipo de bloqueo debes establecer para que el segundo usuario
obtenga los datos con los cambios que está efectuando el primero?
Bloqueo pesimista.
46 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Bloqueo optimista.
Correcto. Este tipo de bloqueo impide que un usuario lea los datos del
registro hasta que se finalice la modificación que ha empezado otro.
Incorrecto. Este bloqueo permite que se lean los datos con la versión
que existía antes de que otro usuario comenzara a cambiarlos.
Solución
1. Opción correcta
2. Incorrecto
47 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
bloqueo compartido: Este modo permite que sea compartido el recurso asociado,
dependiendo de la operación en la que se encuentra involucrado. Varios usuarios que
estén leyendo datos pueden compartir los datos, realizando bloqueos compartidos
para prevenir el acceso concurrente de un escritor que necesita un bloqueo exclusivo.
Varias transacciones pueden obtener bloqueos compartidos del mismo recurso.
Por ejemplo, supongamos que una transacción usa la sentencia SELECT … FOR UPDATE para
consultar un registro de una tabla. La transacción obtiene un bloqueo exclusivo del registro
y un bloqueo compartido de la tabla. El bloqueo del registro permite a otras sesiones que
modifiquen cualquier otro registro que no sea el registro bloqueado, mientras que el
bloqueo de la tabla previene que otras sesiones modifiquen la estructura de la tabla. De
esta manera, la base de datos permite la ejecución de todas las sentencias que sean
posibles.
48 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Bloqueo automático
49 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
Los bloqueos que establecen las sentencias anteriores terminan una vez que la transacción
ha finalizado.
50 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
7.5.- Interbloqueos
Ejemplo de interbloqueo entre dos tablas con cancelación de bloqueo automático a
nivel de transacción.
Intentamos crear dos tablas con referencias cruzadas, es decir, la primera hace referencia a
la segunda, que aún no está creada, y viceversa. Vamos a solucionar el problema del
interbloqueo considerando la transacción como DEFERRED, es decir la comprobación de las
restricciones se hará en diferido.
Si creo la primera tabla y hago referencia a la segunda, se producirá un error, aún no existe
la segunda tabla:
Informe de error -,
*Cause:
idHuevo number(3) );
idGallina number(3) );
51 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
COMMIT;
Da error en las órdenes de inserción, ya que al insertar en la primera tabla, aún no tenemos
dato en la segunda y exactamente igual al insertar en la segunda.
COMMIT;
Las sentencias para borrar las constraints y las tablas tras el ejemplo, son:
52 de 53 23/08/2021 19:42
UD05. Tratamiento de datos. http://localhost:51235/temp_print_dirs/eXeTempPrintDir_KlD9r...
53 de 53 23/08/2021 19:42