Académique Documents
Professionnel Documents
Culture Documents
Base de Datos II
3‐2‐8 ESP ‐ 0002
(Apuntes)
Comprender los diferentes aspectos del control de concurrencia, 3.4 Mecanismos de Seguros.
aplicar estrategias de recuperación adecuada y diseñar esquemas de III Concurrencia. - Tipos de seguros.
- Protocolos,
seguridad e integridad de bases de datos:
- Dead lock.
CONTENIDO: - Técnicas para prevenirlo.
- Técnicas para deshacerlo.
UNIDAD TEMAS SUBTEMAS 3.5 Etiquetas de tiempo.
1.1 Concepto.
4.1 Concepto.
1.2 Transacciones.
4.2 Identificación y autentificación.
I Recuperación. 1.3 Fallas de transacción.
4.3 Matriz de autorización.
1.4 Fallas del Sistema.
4.4 Definición de un esquema de
1.5 Fallas en el Medio.
IV Seguridad. seguridad.
2.1 Definición.
4.5 Mecanismos de vistas para
2.2 Reglas de Integridad
implementación de seguridad.
2.3 Reglas de integridad de dominio.
4.6 Base de datos estadísticos.
II Integridad. 2.4 Reglas de integridad de relación.
4.7 Inscripción de datos.
2.5 Mecanismos de visitas para
( Codificación)
implementación de integridad.
[ Base de Datos II / Unidad I ] Página 2
www.irvingsd.co.cc | ISC
BIBLIOGRAFIA:
9 Korth, Henry F. Fundamentos de bases de datos, Segunda edición ,1993, Edit. Mc. Graw Hill, España.
9 Date,C.J. Introducción a los sistemas de bases de datos, Quinta edición , 1993, Edit. Addison Wesley Iberoamericana ,S.A, México
9 Widerhold, Diseño de bases de datos, Segunda edición, 1988, Edit. Mc. Graw Hill, México
9 E.B. Fernández. R. C. Summers, C. Wood., The system programming series, data base security and integrity. Edit. Addison Wesley.
9 E. Perry William, Ensuring data base integrity, Edit. John Wiley & Sons.
9 Date C.J. An Introduction to database systems, Edit. Addison Wesley.
[ Base de Datos II / Unidad I ] Página 3
www.irvingsd.co.cc | ISC
UNIDAD I RECUPERACION
1.1 Concepto
1.2 Transacciones
1.3 Fallas De Transacción
1.4 Fallas Del Sistema
1.5 Fallas En El Medio
UNIDAD I
RECUPERACIÓN
1.1 CONCEPTO
1.2 TRANSACCIONES
Ej: una transacción bancaria que saca dinero de una cuenta y lo dispone en otra.
Las transacciones o terminan con éxito y son grabadas en la base o bien fracasan y
debe ser restaurado el estado anterior de la BD.
[ Base de Datos II / Unidad I ] Página 4
www.irvingsd.co.cc | ISC
El componente del sistema encargado de lograr la atomicidad se conoce como
administrador de transacciones y las operaciones COMMIT (comprometer) y
ROLLBACK (retroceder) son la clave de su funcionamiento.
• Identificador de la transacción
• Hora de modificación
• Identificador del registro afectado
• Tipo de acción
• Valor anterior del registro
• Nuevo valor del registro
• Información adicional.
Otra alternativa es manejar 2 archivos de log, uno con la imagen anterior a las
modificaciones y otro con la imagen posterior a las modificaciones. El archivo log es
[ Base de Datos II / Unidad I ] Página 5
www.irvingsd.co.cc | ISC
usualmente una pila que una vez llena va eliminado registros según van entrando
nuevos.
[ Base de Datos II / Unidad I ] Página 6
www.irvingsd.co.cc | ISC
Cuando un usuario esta ingresando datos a una computadora donde se han realizado
varias transacciones y falla el sistema, una vez que este se recupera, su estado corre el
riesgo del duplicado de transacciones.
Una transacción puede fallar por varias causas. Puede ser que los datos de entrada no
son correctos o no coinciden con la BD, también puede ser debido a faltas de recursos.
2.- Todos los cambios restantes se colocan en la base de datos y pueden llegar a liberarse
los recursos detenidos por la transacción. Al entrar a la segunda fase la transacción debe
concluirse.
[ Base de Datos II / Unidad I ] Página 7
www.irvingsd.co.cc | ISC
1.4 FALLAS DEL SISTEMA
(Ejemplo: falla en el suministro eléctrico) que afectan a todas las transacciones que estén
actualmente en progreso, pero no dañan físicamente a la BD.
El puerto principal con relación a la falla del sistema es que “se pierde el contenido
de la memoria principal”. Ya no es posible conocer el estado preciso de cualquier
transacción que esta en progreso al momento de la falla y por lo tanto, tal transacción
nunca podrá terminar satisfactoriamente y deberá ser deshecha cuando el sistema
vuelva a iniciar.
Tal vez sea necesario al momento del reinicio volver a realizar determinadas
transacciones que se completaran satisfactoriamente antes de la falla pero que no
pudieran lograr que su actualización fueran transferidas desde los buffers de la BD
hacia la BD física.
[ Base de Datos II / Unidad I ] Página 8
www.irvingsd.co.cc | ISC
TRANSACCIONES EN MYSQL
El servidor de bases de datos MySQL soporta distintos tipos de tablas, tales como
ISAM, MyISAM, InnoDB y BDB (Berkeley Database). De éstos, InnoDB es el tipo de
tabla más importante (después del tipo predeterminado, MyISAM), y merece una
atención especial.
Las tablas del tipo InnoDB están estructuradas de forma distinta que MyISAM, ya
que se almacenan en un sólo archivo en lugar de tres, y sus principales características
son que permite trabajar con transacciones, y definir reglas de integridad referencial.
Para este fin, las tablas que soportan transacciones, como es el caso de InnoDB,
son mucho más seguras y fáciles de recuperar si se produce algún fallo en el servidor, ya
que las consultas se ejecutan o no en su totalidad. Por otra parte, las transacciones
pueden hacer que las consultas tarden más tiempo en ejecutarse.
En este artículo se asume que se cuenta ya con un servidor MySQL con soporte
para el tipo de tablas InnoDB. En nuestro caso haremos uso de un servidor MySQL 4.013
ejecutándose en un sistema MSWindows.
Para asegurarnos que tenemos soporte para el tipo de tablas InnoDB podemos
ejecutar la siguiente sentencia:
[ Base de Datos II / Unidad I ] Página 9
www.irvingsd.co.cc | ISC
mysql> SHOW VARIABLES LIKE '%innodb%';
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐+
| Variable_name | Value |
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐+
| have_innodb | YES |
| innodb_additional_mem_pool_size | 1048576 |
| innodb_buffer_pool_size | 8388608 |
| innodb_data_file_path | ibdata:30M |
| innodb_data_home_dir | |
| innodb_file_io_threads | 4 |
| innodb_force_recovery | 0 |
| innodb_thread_concurrency | 8 |
| innodb_flush_log_at_trx_commit | 1 |
| innodb_fast_shutdown | ON |
| innodb_flush_method | |
| innodb_lock_wait_timeout | 50 |
| innodb_log_arch_dir | .\ |
| innodb_log_archive | OFF |
| innodb_log_buffer_size | 1048576 |
| innodb_log_file_size | 5242880 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | .\ |
| innodb_mirrored_log_groups | 1 |
| innodb_max_dirty_pages_pct | 90 |
+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐+
20 rows in set (0.00 sec)
La variable más importante es por supuesto have_innodb que tiene el valor YES.
En efecto, una de las principales características de las tablas del tipo InnoDB es que
pueden trabajar con transacciones, o sentencias SQL que son agrupadas como una sola.
Un ejemplo típico de esto es una transacción bancaria. Por ejemplo, si una cantidad de
dinero es transferida de la cuenta de una persona a otra, se requerirán por lo menos dos
consultas:
UPDATE cuentas SET balance = balance ‐ cantidad_transferida WHERE cliente = persona1;
UPDATE cuentas SET balance = balance + cantidad_transferida WHERE cliente = persona2;
[ Base de Datos II / Unidad I ] Página 10
www.irvingsd.co.cc | ISC
Estas dos consultas deben trabajar bien, ¿pero que sucede si ocurre algún imprevisto y
"se cae" el sistema después de que se ejecuta la primer consulta, pero la segunda aún no
se ha completado?. La persona1 tendrá una cantidad de dinero removida de su cuenta, y
creerá que ha realizado su pago, sin embargo, la persona2 estará enfadada puesto que
pensará que no se le ha depositado el dinero que le deben. En este ejemplo tan sencillo
se ilustra la necesidad de que las consultas sean ejecutadas de manera conjunta, o en su
caso, que no se ejecute ninguna de ellas. Es aquí donde las transacciones toman un papel
muy importante.
Vamos a ejecutar algunas consultas para ver como trabajan las transacciones. Lo
primero que tenemos que hacer es crear una tabla del tipo InnoDB e insertar algunos
datos.
Para crear una tabla InnoDB, procedemos con el código SQL estándar CREATE TABLE,
pero debemos especificar que se trata de una tabla del tipo InnoDB (TYPE= InnoDB).
Esto es aplicable a cualquier tipo de tabla, pero cuando no se especifica nada, MySQL
supone que se trata de una tabla MyISAM.
mysql> CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB;
Query OK, 0 rows affected (0.10 sec)
mysql> INSERT INTO innotest VALUES(1);
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO innotest VALUES(2);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO innotest VALUES(3);
Query OK, 1 row affected (0.04 sec)
[ Base de Datos II / Unidad I ] Página 11
www.irvingsd.co.cc | ISC
mysql> SELECT * FROM innotest;
+‐‐‐‐‐‐‐+
| campo |
+‐‐‐‐‐‐‐+
| 1 |
| 2 |
| 3 |
+‐‐‐‐‐‐‐+
3 rows in set (0.00 sec)
De acuerdo, nada espectacular. Ahora veamos como usar transacciones.
mysql> BEGIN;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM innotest;
+‐‐‐‐‐‐‐+
| campo |
+‐‐‐‐‐‐‐+
| 1 |
| 2 |
| 3 |
| 4 |
+‐‐‐‐‐‐‐+
4 rows in set (0.00 sec)
Si en este momento ejecutamos un ROLLBACK, la transacción no será completada, y los
cambios realizados sobre la tabla no tendrán efecto.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)
mysql> SELECT * FROM innotest;
+‐‐‐‐‐‐‐+
| campo |
+‐‐‐‐‐‐‐+
| 1 |
| 2 |
| 3 |
[ Base de Datos II / Unidad I ] Página 12
www.irvingsd.co.cc | ISC
+‐‐‐‐‐‐‐+
3 rows in set (0.00 sec)
Ahora vamos a ver que sucede si perdemos la conexión al servidor antes de que la transacción sea
completada.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO innotest VALUES(4);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM innotest;
+‐‐‐‐‐‐‐+
| campo |
+‐‐‐‐‐‐‐+
| 1 |
| 2 |
| 3 |
| 4 |
+‐‐‐‐‐‐‐+
4 rows in set (0.00 sec)
mysql> EXIT;
Bye
Cuando obtengamos de nuevo la conexión, podemos verificar que el registro no se
insertó, ya que la transacción no fue completada.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 449 to server version: 4.0.13
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> SELECT * FROM innotest;
+‐‐‐‐‐‐‐+
| campo |
+‐‐‐‐‐‐‐+
| 1 |
| 2 |
| 3 |
+‐‐‐‐‐‐‐+
3 rows in set (0.00 sec)
[ Base de Datos II / Unidad I ] Página 13
www.irvingsd.co.cc | ISC
Otro Ejemplo
mysql> CREATE TABLE ventas(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> producto VARCHAR(30) NOT NULL, cantidad TINYINT NOT NULL) TYPE =
InnoDB;
Query OK, 0 rows affected (0.96 sec)
Insertamos Un Registro.
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
Actualizamos el registro.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.06 sec)
[ Base de Datos II / Unidad I ] Página 14
www.irvingsd.co.cc | ISC
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
Vamos a confirmar que deseamos los cambios. Después de ejecutar el COMMIT los
cambios serán permanentes y definitivos.
mysql> COMMIT;
Query OK, 0 rows affected (0.05 sec)
[ Base de Datos II / Unidad I ] Página 15