Bases de datos

Transacciones

Transacciones

Caso 1: Imaginen que tienen que hacer la inserción de 100,000 registros en una tabla y, por esas casualidades de la vida, se apaga el servidor antes de terminar los 100,000 registros

Transacciones

Caso 1: Imaginen que tienen que hacer la inserción de 100,000 registros en una tabla y, por esas casualidades de la vida, se apaga el servidor antes de terminar los 100,000 registros

 

Caso 2: Imaginen que tienen una aplicación que tiene cientos de miles de usuarios en un mismo momento y todos deciden, por casualidad, hacer operaciones de alta de registros al mismo tiempo

Transacciones

Caso 1: Imaginen que tienen que hacer la inserción de 100,000 registros en una tabla y, por esas casualidades de la vida, se apaga el servidor antes de terminar los 100,000 registros

 

Caso 2: Imaginen que tienen una aplicación que tiene cientos de miles de usuarios en un mismo momento y todos deciden, por casualidad, hacer operaciones de alta de registros al mismo tiempo

 

Hasta este momento no tenemos un mecanismo que nos garantice que un conjunto de operaciones sea completado con éxito o que haya fallado

Transacciones

Las bases de datos de tipo InnoDB en MySQL/MariaDB cuentan con un mecanismo para evitar éxitos/fallas parciales que pueden poner en riesgo la integridad de la información de la base de datos: las transacciones

Transacciones

Las bases de datos de tipo InnoDB en MySQL/MariaDB cuentan con un mecanismo para evitar éxitos/fallas parciales que pueden poner en riesgo la integridad de la información de la base de datos: las transacciones

 

De manera muy simple, podemos imaginar que una transacción "empaqueta" varias operaciones distintas como si fueran una sola y las realiza en un mismo momento, de modo que o fallan todas (un fracaso absoluto) o todas son exitosas (un éxito absoluto)

Propiedades

Las transacciones tienen cuatro propiedades importantes:

  • Atomicity: Atomicidad
  • Consistency: Consistencia
  • Isolation: Insulación
  • Durability: Durabilidad

 

Es normal encontrar referencias a estas propiedades usando un mismo acrónimo: ACID

Atomicidad

Se refiere a que el conjunto de operaciones dentro de la transacción se tratan de manera atómica, o indivisibles

 

Si una de ellas falla, toda la operación completa falla

Consistencia

Las operaciones deben seguir las reglas y restricciones establecidas por la base de datos en todo momento, antes, durante y después de una serie de operaciones


El uso de una transacción garantiza que el estado de los datos en una base sea siempre válido

Insulación

Como regla general, las transacciones actúan de manera independiente y transparente de otras transacciones

 

El grado de insulación puede ajustarse para ser más o menos estricto pero el valor por defecto es, para muchos efectos, suficiente

Durabilidad

Las bases de datos que soportan transacciones tienen mecanismos para garantizar que una vez que un conjunto de operaciones ha sido confirmado (committed) se van a guardar en la base de datos sin importar la ocurrencia de fallas técnicas o apagones

 

Estos mecanismos suelen tener un impacto en el desempeño de un SGBD pero no es grave y, al contrario, es beneficioso

Transacciones

SET AUTOCOMMIT = 0;
START TRANSACTION;
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000001', '1981-05-13', 'Fulano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000002', '1981-05-13', 'Mengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000003', '1981-05-13', 'Perengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000004', '1981-05-13', 'Zutano', 'De Tal', 'M', '2014-09-15'); 
COMMIT;

Para realizar una transacción se requieren 4 partes:

Transacciones

SET AUTOCOMMIT = 0;
START TRANSACTION;
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000001', '1981-05-13', 'Fulano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000002', '1981-05-13', 'Mengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000003', '1981-05-13', 'Perengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000004', '1981-05-13', 'Zutano', 'De Tal', 'M', '2014-09-15'); 
COMMIT;

Para realizar una transacción se requieren 4 partes:

  1. Evitar que el motor de la base de datos confirme automáticamente cada consulta

Transacciones

SET AUTOCOMMIT = 0;
START TRANSACTION;
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000001', '1981-05-13', 'Fulano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000002', '1981-05-13', 'Mengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000003', '1981-05-13', 'Perengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000004', '1981-05-13', 'Zutano', 'De Tal', 'M', '2014-09-15'); 
COMMIT;

Para realizar una transacción se requieren 4 partes:

  1. Evitar que el motor de la base de datos confirme automáticamente cada consulta
  2. Iniciar la transacción

Transacciones

SET AUTOCOMMIT = 0;
START TRANSACTION;
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000001', '1981-05-13', 'Fulano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000002', '1981-05-13', 'Mengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000003', '1981-05-13', 'Perengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000004', '1981-05-13', 'Zutano', 'De Tal', 'M', '2014-09-15'); 
COMMIT;

Para realizar una transacción se requieren 4 partes:

  1. Evitar que el motor de la base de datos confirme automáticamente cada consulta
  2. Iniciar la transacción
  3. Realizar las operaciones que se quieran

Transacciones

SET AUTOCOMMIT = 0;
START TRANSACTION;
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000001', '1981-05-13', 'Fulano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000002', '1981-05-13', 'Mengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000003', '1981-05-13', 'Perengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000004', '1981-05-13', 'Zutano', 'De Tal', 'M', '2014-09-15'); 
COMMIT;

Para realizar una transacción se requieren 4 partes:

  1. Evitar que el motor de la base de datos confirme automáticamente cada consulta
  2. Iniciar la transacción
  3. Realizar las operaciones que se quieran
  4. Confirmar la transacción

Transacciones

SET AUTOCOMMIT = 0;
START TRANSACTION;
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000001', '1981-05-13', 'Fulano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000002', '1981-05-13', 'Mengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000003', '1981-05-13', 'Perengano', 'De Tal', 'M', '2014-09-15'); 
INSERT INTO `employees` (`emp_no`, `birth_date`, `first_name`, `last_name`, `gender`, `hire_date`) VALUES ('5000004', '1981-05-13', 'Zutano', 'De Tal', 'M', '2014-09-15'); 
COMMIT;

Para realizar una transacción se requieren 4 partes:

  1. Evitar que el motor de la base de datos confirme automáticamente cada consulta
  2. Iniciar la transacción
  3. Realizar las operaciones que se quieran
  4. Confirmar la transacción
SET autocommit = 0;
START TRANSACTION;
DELETE FROM `employees` WHERE `emp_no` IN (5000001,5000002,5000003,5000004);
ROLLBACK;

Transacciones

Ahora bien, también podemos cancelar una transacción en vez de confirmarla:

SET autocommit = 0;
START TRANSACTION;
DELETE FROM `employees` WHERE `emp_no` IN (5000001,5000002,5000003,5000004);
ROLLBACK;

Transacciones

Ahora bien, también podemos cancelar una transacción en vez de confirmarla:

  1. Evitar que el motor de la base de datos confirme automáticamente cada consulta
SET autocommit = 0;
START TRANSACTION;
DELETE FROM `employees` WHERE `emp_no` IN (5000001,5000002,5000003,5000004);
ROLLBACK;

Transacciones

Ahora bien, también podemos cancelar una transacción en vez de confirmarla:

  1. Evitar que el motor de la base de datos confirme automáticamente cada consulta
  2. Iniciar la transacción
SET autocommit = 0;
START TRANSACTION;
DELETE FROM `employees` WHERE `emp_no` IN (5000001,5000002,5000003,5000004);
ROLLBACK;

Transacciones

Ahora bien, también podemos cancelar una transacción en vez de confirmarla:

  1. Evitar que el motor de la base de datos confirme automáticamente cada consulta
  2. Iniciar la transacción
  3. Realizar las operaciones que se quieran
SET autocommit = 0;
START TRANSACTION;
DELETE FROM `employees` WHERE `emp_no` IN (5000001,5000002,5000003,5000004);
ROLLBACK;

Transacciones

Ahora bien, también podemos cancelar una transacción en vez de confirmarla:

  1. Evitar que el motor de la base de datos confirme automáticamente cada consulta
  2. Iniciar la transacción
  3. Realizar las operaciones que se quieran
  4. Cancelar la transacción
SET autocommit = 0;
START TRANSACTION;
DELETE FROM `employees` WHERE `emp_no` IN (5000001,5000002,5000003,5000004);
ROLLBACK;

Transacciones

Ahora bien, también podemos cancelar una transacción en vez de confirmarla:

  1. Evitar que el motor de la base de datos confirme automáticamente cada consulta
  2. Iniciar la transacción
  3. Realizar las operaciones que se quieran
  4. Cancelar la transacción

Transacciones

Durante la ejecución de una transacción, pero antes de su confirmación, los cambios a la base de datos se guardan en la memoria del servidor

 

Cuando se confirma una transacción, esos cambios se guardan en los discos duros del servidor

 

La implicación más práctica de eso es que durante una misma transacción podemos operar los valores nuevos o alterados como si ya existieran en la base de datos pero hasta que no se confirme, los cambios no se han hecho realmente

 

Lo anterior tiene una excepción: si hay valores auto-incrementables y la transacción se cancela, los valores auto-incrementables sí cambian

Bases de datos: Transacciones

By Gilberto 🦁

Bases de datos: Transacciones

Transacciones

  • 66