[MySQL] Transacciones y sus niveles de aislamiento/aislamiento


Los estudiantes que necesitan servidores en la nube y otros productos en la nube para aprender Linux pueden pasar a / --> Tencent Cloud <-- / --> Alibaba Cloud <-- / --> Huawei Cloud <-- / sitio web oficial, los servidores en la nube livianos son de bajo costo a 112 yuanes al año, y los nuevos usuarios pueden disfrutar de descuentos ultrabajos en su primer pedido.


 Tabla de contenido

1. El concepto de asuntos.

1. Cuatro características de las transacciones

2. El papel de los asuntos.

3. Soporte de motor de almacenamiento para transacciones.

4. Método de envío de transacciones

2. Inicio, reversión y envío de transacciones

1. Preparación: ajuste el nivel de aislamiento predeterminado de MySQL al más bajo/cree una tabla de prueba

2. Inicio, reversión y envío de transacciones

3. Si la transacción no se confirma después de iniciarla, pero el cliente falla, MySQL se revertirá automáticamente.

3. Nivel de aislamiento de transacciones

1. Aislamiento

2. Nivel de aislamiento

3. Visualización y configuración del aislamiento.

3.1 Visualización aislada

3.2 Establecer nivel de aislamiento

4. Explicación detallada de los cuatro niveles de aislamiento.

4.1Leer no confirmado【Leer no confirmado】

4.2 Lectura comprometida

4.3 Lectura repetible 【Lectura repetible】

4.4 Serialización [Serializable]


1. El concepto de asuntos.

1. Cuatro características de las transacciones

Una transacción se compone de un grupo de declaraciones DML. Estas declaraciones están relacionadas lógicamente. Este grupo de declaraciones DML tiene éxito o falla. Es un todo. Por ejemplo, una operación de transferencia bancaria parece ser una operación de transferencia simple desde la capa superior, pero la capa inferior requiere una o más declaraciones SQL para completar la operación de transferencia. Este conjunto de declaraciones SQL es un todo y se denomina transacción. La transacción también estipula que los datos vistos por diferentes clientes son diferentes.

Una base de datos MySQL puede tener más de una transacción en ejecución y, al mismo tiempo, una gran cantidad de solicitudes se empaquetan en transacciones e inician solicitudes de procesamiento de transacciones al servidor MySQL. Si varios usuarios acceden a los mismos datos de la tabla sin protección, definitivamente ocurrirán problemas. Además, la transacción consta de múltiples declaraciones SQL y puede haber situaciones en las que ocurra un error en medio de la ejecución o la transacción no quiera ejecutarse nuevamente, entonces, ¿qué debo hacer si ya se ejecutó?

Por lo tanto, una transacción completa definitivamente no es una simple colección de SQL, sino que también debe satisfacer los siguientes cuatro atributos:

Atomicidad: todas las operaciones en una transacción se completan por completo o no se completan y no terminarán en algún punto intermedio. Si se produce un error durante la ejecución de la transacción, se revertirá al estado anterior a que comenzara la transacción, como si la transacción nunca se hubiera ejecutado.

Consistencia: la integridad de la base de datos no se ve comprometida antes de que comience la transacción y después de que finalice. Esto significa que los datos escritos deben cumplir plenamente con todas las reglas preestablecidas, incluida la precisión y la concatenación de los datos, y que la base de datos posterior puede completar espontáneamente el trabajo predeterminado. La atomicidad, el aislamiento y la durabilidad son causas y la consistencia es el efecto.

Aislamiento: la base de datos permite que múltiples transacciones simultáneas lean, escriban y modifiquen sus datos al mismo tiempo. El aislamiento puede evitar la inconsistencia de los datos debido a la ejecución cruzada cuando se ejecutan múltiples transacciones al mismo tiempo. El aislamiento de transacciones se divide en diferentes niveles, que incluyen lectura no confirmada (lectura no confirmada), lectura confirmada (lectura confirmada), lectura repetible (lectura repetible) y serialización (serializable).

Durabilidad: Una vez completada la transacción, las modificaciones a los datos son permanentes y no se perderán incluso si el sistema falla.

Los cuatro atributos anteriores pueden denominarse ACID.

Atomicidad ( o indivisibilidad )

Consistencia _ _

Aislamiento ( también conocido como independencia)

Durabilidad._ _ _

2. El papel de los asuntos.

Cuando los programadores escriben lógica de código de nivel superior para acceder a la base de datos, las transacciones pueden simplificar varios detalles que deben considerarse durante la programación. Por ejemplo, cuando usamos transacciones, podemos confirmar o deshacer, y no tenemos que preocuparnos por anomalías de la red, tiempo de inactividad del servidor, etc.

3. Soporte de motor de almacenamiento para transacciones.

En MySQL, sólo Innodb admite transacciones, mientras que MyISAM no.

4. Método de envío de transacciones

Los métodos de envío de transacciones se dividen en envío automático y envío manual.

Envío automático:

--查看MySQL事务的提交方式发现是自动提交
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.02 sec)

Utilice set para cambiar el método de envío de transacciones de MySQL: 

--将MySQL的事务提交方式修改为禁止自动提交
mysql> set autocommit=0;
Query OK, 0 rows affected (0.01 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

--将MySQL的事务提交方式修改为开启自动提交
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

2. Inicio, reversión y envío de transacciones

1. Preparación: ajuste el nivel de aislamiento predeterminado de MySQL al más bajo/cree una tabla de prueba

Para ver el fenómeno de demostración, primero configure el nivel de aislamiento predeterminado de MySQL para leer no confirmado (el más bajo) y luego salga y reinicie:

mysql> set global transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.00 sec)
--修改默认隔离级别生效
mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set, 1 warning (0.00 sec)

Crear tabla de prueba:

create table if not exists account(
id int primary key,
name varchar(50) not null default '',
blance decimal(10,2) not null default 0.0
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

2. Inicio, reversión y envío de transacciones

Usuario: jly

--1、查看当前MySQL在线用户
mysql> show processlist;--开始一个事务也可以用begin
+-----+------+-----------+------------------+---------+------+----------+------------------+
| Id  | User | Host      | db               | Command | Time | State    | Info             |
+-----+------+-----------+------------------+---------+------+----------+------------------+
| 474 | jly  | localhost | transaction_data | Query   |    0 | starting | show processlist |
| 475 | jly  | localhost | NULL             | Sleep   |  132 |          | NULL             |
| 476 | root | localhost | NULL             | Sleep   |    5 |          | NULL             |
+-----+------+-----------+------------------+---------+------+----------+------------------+
3 rows in set (0.00 sec)
--2、先确认事务的提交方式为自动提交
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.02 sec)
--3、开始一个事务,start transaction执行之后,后方的SQL将处于同一个事务
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
--4、创建一个保存节点save1
mysql> savepoint save1;
Query OK, 0 rows affected (0.00 sec)
--5、在当前表中插入一条数据
mysql> insert into account values(1,'张三',1234.5);
Query OK, 1 row affected (0.00 sec)
--6、创建一个保存节点save2
mysql> savepoint save2;
Query OK, 0 rows affected (0.00 sec)
--7、在当前表中再次插入一条数据
mysql> insert into account values(2,'李四',998.561);
Query OK, 1 row affected, 1 warning (0.00 sec)
--8、创建一个保存节点save3
mysql> savepoint save3;
Query OK, 0 rows affected (0.00 sec)
--9、在当前表中再次插入一条数据
mysql> insert into account values(3,'王五',653.25);
Query OK, 1 row affected (0.00 sec)
--10、回滚到保存点save3
mysql> rollback to save3;--如果全部回滚,可以直接rollback;
Query OK, 0 rows affected (0.00 sec)
--11、提交以结束本次事务
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

Usuario: raíz

--当上方用户执行完第三步时,让另一个用户开始一个事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
--当上方用户执行完第五步时,root用户查看表发现表中存在一条数据
mysql> select* from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  1 | 张三   | 1234.50 |
+----+--------+---------+
1 row in set (0.00 sec)
--当上方用户执行完第九步时,root用户查看表发现表中存在三条数据
mysql> select* from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  1 | 张三   | 1234.50 |
|  2 | 李四   |  998.56 |
|  3 | 王五   |  653.25 |
+----+--------+---------+
3 rows in set (0.00 sec)
--当上方用户执行完第十步时,root用户查看表发现王五没了
mysql> select* from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  1 | 张三   | 1234.50 |
|  2 | 李四   |  998.56 |
+----+--------+---------+
2 rows in set (0.00 sec)
--提交以结束本次事务
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

1. Si en una transacción, el usuario finalmente confirma la transacción, MySQL persistirá en las modificaciones de datos en esta transacción y no habrá posibilidad de revertirlas.

2. Si retrocede de save3 a save1 y descubre que ha avanzado demasiado, no puede avanzar de save1 a save3. MySQL le indicará que SAVEPOINT s3 no existe.

3. Si la transacción no se confirma después de iniciarla, pero el cliente falla, MySQL se revertirá automáticamente.

Usuario: jly

--1、启动事务并插入数据
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select* from account;
Empty set (0.01 sec)
mysql> insert into account values(1,'张三',1234.5);
Query OK, 1 row affected (0.01 sec)
mysql> insert into account values(2,'李四',998.561);
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> insert into account values(3,'王五',653.25);
Query OK, 1 row affected (0.00 sec)
--2、未commit,使用ctrl+\终止MySQL
mysql> Aborted

Usuario: raíz

--1、启动事务
mysql> begin;
--当上方用户执行完第一步时,查看表
mysql> select* from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  1 | 张三   | 1234.50 |
|  2 | 李四   |  998.56 |
|  3 | 王五   |  653.25 |
+----+--------+---------+
3 rows in set (0.00 sec)
--当上方用户执行完第二步时,查看表,发现数据回退
mysql> select* from account;
Empty set (0.00 sec)

Si la transacción no se confirma después de iniciarla, pero el cliente falla o lo cierra a la fuerza, MySQL se revertirá automáticamente.

1. La confirmación automática no afectará el envío de transacciones iniciadas después de comenzar. Debe ingresar la confirmación después de usar comenzar para que los datos sean persistentes.

2. La esencia de una sola declaración SQL es una transacción, y su persistencia está relacionada con la confirmación automática. La confirmación automática está activada, lo que significa que la declaración SQL única se enviará automáticamente sin confirmación manual. De lo contrario, se requiere la confirmación manual para generar los datos. persistente. (Existen casos especiales para seleccionar porque MySQL tiene MVCC)

3. Las transacciones se pueden revertir manualmente y, al mismo tiempo, MySQL se revertirá automáticamente cuando la operación sea anormal.

4. Podemos ver la atomicidad (reversión) y durabilidad (compromiso) de la transacción en sí.

3. Nivel de aislamiento de transacciones

1. Aislamiento

1. Se puede acceder al servicio MySQL mediante múltiples procesos de cliente (subprocesos) al mismo tiempo, y el acceso se realiza de forma transaccional.

2. Una transacción puede estar compuesta por varias declaraciones SQL, lo que significa que cualquier transacción tiene etapas antes de la ejecución, durante la ejecución y después de la ejecución. La llamada atomicidad en realidad significa que la capa de usuario puede ver antes o después de la ejecución. Si ocurre un problema durante la ejecución, puede retroceder en cualquier momento. Por tanto, la característica de una única transacción para los usuarios es la atomicidad .

3. Sin embargo, todas las transacciones deben tener un proceso de ejecución, por lo que cuando varias transacciones ejecutan varios SQL respectivamente, aún puede haber influencia mutua. Por ejemplo: varias transacciones acceden a la misma tabla o incluso a la misma fila de datos al mismo tiempo.

4. En la base de datos, para garantizar que haya la menor interferencia posible durante la ejecución de la transacción, existe una característica importante: el aislamiento.

5. En la base de datos, hay una característica importante que permite que las transacciones sean interferidas en diversos grados: el nivel de aislamiento.

2. Nivel de aislamiento

Estos cuatro puntos tienen que ver con la simultaneidad de lectura y escritura:

Lectura no confirmada: en este nivel de aislamiento, todas las transacciones pueden ver los resultados de ejecución no confirmada de otras transacciones. (Es imposible utilizar este nivel de aislamiento en la producción real), pero equivale a no tener aislamiento, y también habrá muchos problemas de concurrencia, como lecturas sucias, lecturas fantasmas, lecturas no repetibles, etc. experimentos, utilizamos Es este aislamiento.

Lectura confirmada: este nivel de aislamiento es el nivel de aislamiento predeterminado de la mayoría de las bases de datos (no el predeterminado de MySQL). Cumple con la definición simple de aislamiento: una transacción solo puede ver los cambios realizados por otras transacciones confirmadas. Este nivel de aislamiento provocará lecturas no repetibles , es decir, cuando se ejecuta una transacción, si selecciona varias veces, puede obtener resultados diferentes.

Lectura repetible [Lectura repetible]: este es el nivel de aislamiento predeterminado de MySQL. Garantiza que se verá la misma fila de datos cuando la misma transacción lea datos de operación varias veces durante la ejecución. Pero algunas bases de datos tienen problemas de lectura fantasma . (MySQL no)

Serializable: este es el nivel de aislamiento más alto para las transacciones. Resuelve el problema de las lecturas fantasma al obligar a las transacciones a ordenarse para que no puedan entrar en conflicto entre sí. Agrega un bloqueo compartido en cada fila de datos leída. Sin embargo, puede provocar tiempos de espera y competencia de bloqueo (este nivel de aislamiento es demasiado extremo y básicamente no se utiliza en la producción real)

Cómo implementar el nivel de aislamiento: el aislamiento se implementa básicamente mediante bloqueos. Diferentes niveles de aislamiento requieren un uso de bloqueo diferente. Los más comunes incluyen bloqueos de tabla, bloqueos de fila, bloqueos de lectura, bloqueos de escritura, bloqueos de espacio (GAP), bloqueos de siguiente tecla (GAP+bloqueos de fila), etc. 

3. Visualización y configuración del aislamiento.

3.1 Visualización aislada

--查看全局的隔离级别
mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| READ-UNCOMMITTED      |
+-----------------------+
1 row in set, 1 warning (0.02 sec)

--查看当前会话的隔离级别
mysql> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| READ-UNCOMMITTED       |
+------------------------+
1 row in set, 1 warning (0.00 sec)

--默认同上
mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set, 1 warning (0.00 sec)

El nivel de aislamiento de la sesión actual se basa en el nivel de aislamiento global. 

3.2 Establecer nivel de aislamiento

gramática:

--设置当前会话 or 全局隔离级别语法
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ
COMMITTED | REPEATABLE READ | SERIALIZABLE}

Establezca el nivel de aislamiento de la sesión en lectura confirmada: 

mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)
--修改后,全局隔离级别没有变,会话隔离级别被修改为读提交
mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| READ-UNCOMMITTED      |
+-----------------------+
1 row in set, 1 warning (0.00 sec)

mysql> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| READ-COMMITTED         |
+------------------------+
1 row in set, 1 warning (0.00 sec)

Cambie el nivel de aislamiento a confirmación de lectura. En este momento, los niveles de aislamiento de otros usuarios no se modificarán. Esto solo cambia el nivel de aislamiento del usuario actual.

Después de iniciar sesión nuevamente, el nivel de aislamiento de la sesión se reconfigurará de acuerdo con el nivel de aislamiento global.

Establezca el nivel de aislamiento global en serializado:

mysql> set global transaction isolation level SERIALIZABLE;
Query OK, 0 rows affected (0.01 sec)

--修改全局的隔离级别只影响全局的,当前会话和默认的隔离级别不变
mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| SERIALIZABLE          |
+-----------------------+
1 row in set, 1 warning (0.00 sec)

mysql> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| READ-COMMITTED         |
+------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set, 1 warning (0.00 sec)

Cuando una sesión modifica el nivel de aislamiento global, los niveles de aislamiento global de todas las demás sesiones se modificarán al mismo tiempo.

En inicios de sesión posteriores, la sesión y el nivel de aislamiento predeterminado harán referencia a la configuración del nivel de aislamiento global.

Intente asegurarse de que el nivel de aislamiento sea coherente y no cambie el nivel de aislamiento de la transacción cuando no tenga nada que hacer.

4. Explicación detallada de los cuatro niveles de aislamiento.

4.1Leer no confirmado【Leer no confirmado】

--先设置当前的全局隔离级别为读未提交,再退出MySQL重新登录一下让其生效
mysql> set global transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.01 sec)

El segundo capítulo de este artículo utiliza la lectura no comprometida como ejemplo.

Inicie transacciones en múltiples sesiones paralelas. Incluso si una transacción cambia la base de datos sin confirmación, otras transacciones pueden ver los datos que modificó en tiempo real. Cuando se ejecuta una transacción, lee datos actualizados (u otras operaciones) pero no confirmados de otra transacción en ejecución. Este fenómeno irrazonable se denomina lectura sucia.

Otros fenómenos irrazonables de lectura no comprometida incluyen la lectura no repetible y la lectura fantasma.

La lectura no confirmada casi no tiene bloqueo, aunque es eficiente, tiene demasiados problemas y no se recomienda.

4.2 Lectura comprometida

Usuario: jly

--1、先设置当前的全局隔离级别为读提交,再退出MySQL重新登录一下让其生效
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)
--2、开始事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
--3、插入一条数据
mysql> insert into account values (4,'赵六',123);
Query OK, 1 row affected (0.01 sec)
--4、提交
mysql> commit;
Query OK, 0 rows affected (0.02 sec)

Usuario: raíz

--开始事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
--当上方用户执行完第3步时,查看表数据,并没有看到插入的赵六的信息
mysql> select* from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  1 | 张三   | 1234.50 |
|  2 | 李四   |  998.56 |
|  3 | 王五   |  653.25 |
+----+--------+---------+
3 rows in set (0.01 sec)
--当上方用户执行完第4步时,查看表数据,能够看到赵六的信息
mysql> select* from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  1 | 张三   | 1234.50 |
|  2 | 李四   |  998.56 |
|  3 | 王五   |  653.25 |
|  4 | 赵六   |  123.00 |
+----+--------+---------+
4 rows in set (0.02 sec)

A través de experimentos, podemos encontrar el nivel de confirmación de lectura. Antes de que la transacción A confirme la transacción, las modificaciones realizadas no serán vistas por otras transacciones. Una vez que la transacción A inicia la confirmación, otras transacciones pueden ver las modificaciones realizadas por la transacción A en los datos. . Esto hace que otras transacciones encuentren datos diferentes cuando seleccionan ver la base de datos en diferentes momentos. Este fenómeno se llama lectura no repetible . (Las lecturas dentro de una transacción no son atómicas)

4.3 Lectura repetible 【Lectura repetible】

La lectura repetible es el nivel de aislamiento predeterminado de MySQL.

Usuario: jly

--1、重启MySQL
systemctl restart mysqld
--2、重启后查看默认的隔离级别为读提交
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)
--3、启动事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
--4、将id为2的名字(李四)修改为张三
mysql> update account set name='张三' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select* from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  1 | 张三   | 1234.50 |
|  2 | 张三   |  998.56 |
|  3 | 王五   |  653.25 |
|  4 | 赵六   |  123.00 |
+----+--------+---------+
4 rows in set (0.01 sec)
--5、提交事务
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

Usuario: raíz

--启动事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
--当上方用户执行完第4步时,查看表数据,李四并没有被修改为张三
mysql> select *from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  1 | 张三   | 1234.50 |
|  2 | 李四   |  998.56 |
|  3 | 王五   |  653.25 |
|  4 | 赵六   |  123.00 |
+----+--------+---------+
4 rows in set (0.00 sec)
--提交事务
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
--当上方用户执行完第5步时,查看表数据,李四被修改为张三
mysql> select *from account;
+----+--------+---------+
| id | name   | blance  |
+----+--------+---------+
|  1 | 张三   | 1234.50 |
|  2 | 张三   |  998.56 |
|  3 | 王五   |  653.25 |
|  4 | 赵六   |  123.00 |
+----+--------+---------+
4 rows in set (0.00 sec)

Bajo este nivel de aislamiento, una transacción MySQL no afectará la lectura de otra transacción antes de la confirmación. Este nivel de aislamiento se denomina lectura repetible.

En el caso de lectura repetible, una base de datos general no puede proteger los datos insertados por otras transacciones, porque la implementación del aislamiento se completa bloqueando los datos y los datos a insertar no existen, por lo que el bloqueo general no puede proteger este tipo de datos. El problema es que, aunque la mayor parte del contenido es repetible, los datos insertados se leen en un estado repetible. Al buscar varias veces, se encontrarán más registros nuevos, lo cual es como una ilusión. Este fenómeno se llama lectura fantasma (principalmente para escenarios de inserción) . Obviamente, MySQL resolvió el problema de lectura fantasma cuando estaba en el nivel RR (la solución fue usar bloqueos de siguiente clave (GAP + bloqueos de fila)). 

4.4 Serialización [Serializable]

La serialización significa bloquear todas las transacciones y poner en cola la ejecución de las transacciones una por una, lo que conduce a una baja eficiencia.

Cuando se abren la transacción A y la transacción B, las dos transacciones usarán bloqueos compartidos para leer al mismo tiempo y no se serializarán; si hay actualizaciones y otras operaciones en la transacción A, A se bloqueará hasta que se envíe la transacción B. Si la transacción A se bloquea durante demasiado tiempo, la transacción actual se cerrará debido al tiempo de espera de bloqueo.

Supongo que te gusta

Origin blog.csdn.net/gfdxx/article/details/131447315
Recomendado
Clasificación