Transacciones basadas en MySQL

¡Acostúmbrate a escribir juntos! Este es el noveno día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .

Una transacción es una colección de operaciones, que es una unidad de trabajo indivisible. Una transacción envía o revoca solicitudes de operación al sistema como un todo, es decir, estas operaciones tienen éxito o fallan al mismo tiempo.

Por ejemplo: Zhang San transfiere 1000 yuanes a Li Si, el dinero en la cuenta bancaria de Zhang San se reduce en 1000 y el dinero en la cuenta bancaria de Li Si aumenta en 1000.

Este conjunto de operaciones debe estar dentro del alcance de una transacción, ya sea que todas tengan éxito o todas fallen.

Situación normal: la operación de transferencia debe completarse en los siguientes tres pasos. Después de completar los tres pasos, Zhang San disminuye en 1000, mientras que Li Si aumenta en 1000, y la transferencia es exitosa:

Situación anormal: la operación de transferencia también se divide en los siguientes tres pasos para completar. En el tercer paso, se informa un error, lo que hace que Zhang San reduzca 1,000 yuanes, mientras que la cantidad de Li Si no cambia, lo que resulta en corrupción de datos. Si no coincide, hay un problema. 

Para resolver los problemas anteriores, necesitamos completar la transacción a través de los datos. Solo necesitamos abrir la transacción antes de la ejecución de la lógica comercial y enviar la transacción después de que se complete la ejecución. Si se informa un error durante la ejecución, la transacción se retrotrae y los datos se restauran al estado anterior al inicio de la transacción.

Nota: La transacción predeterminada de MySQL se confirma automáticamente, es decir, cuando se ejecuta una declaración DML, MySQL confirmará la transacción de forma inmediata e implícita.

1. Operación de transacción

Guión de base de datos: 

drop table if exists account;
create table account
(
    id    int primary key AUTO_INCREMENT comment 'ID',
    name  varchar(10) comment '姓名',
    money double(10, 2) comment '余额'
) comment '账户表';
insert into account(name, money)
VALUES ('张三', 2000),
       ('李四', 2000);
复制代码

1.1 Transacciones no controladas

1. Prueba la situación normal

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';
复制代码

Una vez completada la prueba, verifique el estado de los datos, puede ver que la operación de datos es consistente antes y después

2. Prueba de excepciones

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三'; 出错了....
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四'
复制代码

Restauramos los datos a 2000 y luego ejecutamos la declaración SQL anterior una vez más (error.... Esta oración no se ajusta a la sintaxis SQL y se informará un error cuando se ejecute), verificamos la situación final de los datos y encontramos que los datos son inconsistentes antes y después del lapso de operación

1.2 Transacción de control uno

1. Ver/establecer el método de envío de transacciones

SELECT @@autocommit ; 

SET @@autocommit = 0 ;
复制代码

2. Enviar la transacción

COMMIT;
复制代码

3. Revertir la transacción

ROLLBACK;
复制代码

Darse cuenta:

En el método anterior, modificamos el comportamiento de confirmación automática de la transacción y cambiamos la confirmación automática predeterminada a confirmación manual. En este momento, ninguna de las declaraciones DML que ejecutamos se confirmará, y debemos ejecutar manualmente la confirmación para confirmar. .

1.3 Transacción de control 2

1. Empieza tu negocio

START TRANSACTION 或 BEGIN ;
复制代码

2. Enviar la transacción

COMMIT;
复制代码

3. Revertir la transacción

ROLLBACK;
复制代码

Transferir caso:

-- 开启事务 
start transaction 
-- 1. 查询张三余额 
select * from account where name = '张三'; 
-- 2. 张三的余额减少1000 
update account set money = money - 1000 where name = '张三'; 
-- 3. 李四的余额增加1000 
update account set money = money + 1000 where name = '李四'; 
-- 如果正常执行完毕, 则提交事务 
commit; 
-- 如果执行过程中报错, 则回滚事务 
-- rollback;
复制代码

2. Cuatro características de las transacciones

  1. Atomicidad: una transacción es la unidad de operación más pequeña que es indivisible, todas tienen éxito o todas fallan.

  2. Coherencia: cuando se completa una transacción, todos los datos deben estar en un estado coherente.

  3. Aislamiento: el mecanismo de aislamiento proporcionado por el sistema de base de datos garantiza que las transacciones se ejecuten en un entorno independiente que no se vea afectado por operaciones concurrentes externas.

  4. Durabilidad: una vez que una transacción se confirma o revierte, sus cambios en los datos de la base de datos son permanentes.

Las anteriores son las cuatro características de las transacciones, denominadas ACID.

3. Problemas de transacciones concurrentes

1. Lectura sucia: una transacción lee datos que aún no han sido confirmados por otra transacción.

2. Lectura no repetible: una transacción lee el mismo registro sucesivamente, pero los datos leídos dos veces son diferentes, lo que se denomina lectura no repetible.

3. Lectura fantasma: cuando una transacción consulta datos de acuerdo con las condiciones, no hay una fila de datos correspondiente, pero al insertar datos, se encuentra que esta fila de datos ya existe, como si hubiera un "fantasma".

4. Nivel de aislamiento de transacciones

Para solucionar los problemas causados ​​por transacciones concurrentes, se introdujo el nivel de aislamiento de transacciones en la base de datos. Principalmente son los siguientes:

1. Verifique el nivel de aislamiento de la transacción

SELECT @@TRANSACTION_ISOLATION; 1
复制代码

2. Establecer el nivel de aislamiento de transacciones

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL 
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
复制代码

Nota: cuanto mayor sea el nivel de aislamiento de transacciones, más seguros serán los datos, pero menor será el rendimiento

Supongo que te gusta

Origin juejin.im/post/7084569974215278623
Recomendado
Clasificación