Gilberto 🦁 PRO
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales
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 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
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
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
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)
Las transacciones tienen cuatro propiedades importantes:
Es normal encontrar referencias a estas propiedades usando un mismo acrónimo: ACID
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
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
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
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
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:
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:
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:
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:
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:
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:
SET autocommit = 0;
START TRANSACTION;
DELETE FROM `employees` WHERE `emp_no` IN (5000001,5000002,5000003,5000004);
ROLLBACK;
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;
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;
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;
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;
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;
Ahora bien, también podemos cancelar una transacción en vez de confirmarla:
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
By Gilberto 🦁
Transacciones
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales