MySQL transacción y mecanismo de bloqueo


Sugerencia: el siguiente es el contenido del texto principal de este artículo, y la serie de aprendizaje de MySQL continuará actualizándose

inserte la descripción de la imagen aquí

1. Asuntos

  • En la base de datos, esperamos que algunas operaciones se puedan realizar de manera atómica, o se pueden ejecutar con éxito, o no se ejecutan, es decir, solo se pueden ejecutar como un todo, llamamos a ese grupo de operaciones atómicas. es negocio _
  • Nuestro MySQL admite 9 motores de base de datos, pero solo el Innodbmotor admite funciones de transacción.

1.1 Características de la transacción

  • Atomicidad : una transacción es una unidad de trabajo indivisible, y las operaciones incluidas en la transacción se realizan o no se realizan.
  • Consistencia : una transacción debe cambiar la base de datos de un estado consistente a otro. La integridad de la base de datos no se ve comprometida antes de que comience la transacción y después de que finalice.
  • Aislamiento : cuando múltiples transacciones operan en el mismo recurso al mismo tiempo, la ejecución de una transacción no puede ser interferida por otras transacciones. La simultaneidad aquí es solo un rendimiento macroscópico, de hecho, solo una transacción se ejecuta al mismo tiempo en el nivel microscópico, mientras que otras transacciones están esperando.
  • Durabilidad : una vez que se confirma una transacción, sus cambios en los datos de la base de datos deben ser permanentes, incluso si el sistema falla, no se perderá.

1.2 Nivel de aislamiento

Más búsqueda del aislamiento (los datos son más correctos) -------------------------------------------- ------------------------------------------------ ---------------------------------> Más búsqueda de la concurrencia (mayor rendimiento)
(serializabilidad)
serializable
(lectura instantánea)
snapshot_read
(lectura repetible)
repeatable_read
(leer comprometido)
read_committed
(leer no comprometido)
read_uncommitted

Este es el nivel de aislamiento más alto y resuelve las lecturas fantasma al hacer cumplir el orden de las transacciones para que no entren en conflicto entre sí. En resumen, agrega un bloqueo compartido en cada lectura de fila de datos . En este nivel, puede resultar una gran cantidad de tiempos de espera y contención de bloqueo.



No es un nivel de aislamiento que existe en el estándar y, actualmente, no tiene efectos secundarios.
Las lecturas repetibles en MySQL son en realidad lecturas instantáneas. Porque el mecanismo MVCC resuelve la lectura fantasma .


Este es el nivel de aislamiento de transacciones predeterminado de MySQL, que garantiza que varias instancias de la misma transacción verán las mismas filas de datos cuando lean datos simultáneamente . Esto provoca una lectura fantasma : 当用户修改某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有一条未修改的数据“幻影”. Solo puede leer el contenido enviado por otras transacciones y hay un problema de lectura no repetible: 一个事务多次读取同一数据可能会得到多个不同的结果.



Puede leer contenido no confirmado en otras transacciones y hay un problema de lectura sucia. Leer datos no confirmados, también llamados 脏读.




Podemos modificar el nivel de aislamiento:

set session transaction isolation level read uncommitted;

volver al contenido...

1.3 Iniciar una transacción

①SQL abre la transacción

-- 开启事务
start transaction; / begin;
SQL1;
SQL2;
rollback; -- 主动回滚

-- 开启事务
start transaction; / begin;
SQL1;
SQL2;
SQL3;
commit; -- 提交事务,失败也会回滚

②Transacción de uso de JDBC

// 要使用事务,在同一个事务中,操作 sql1 和 sql2,意味着必须在一条 Connection 完成
try (Connection c = DBUtil.connection()) {
    
    
    // connection 中有一个自动提交(autocommit)的属性,默认情况下是 true(开启)
    // 开启状态下,意味着,每一条 sql 都会被独立的视为一个事务
    // 我们要让 sql1 和 sql2 看作整体,只需要关闭 connection 的自动提交
    c.setAutoCommit(false);
    // 此时就可以手动的控制事务的结束位置,并且需要手动提交

    try (PreparedStatement ps = c.prepareStatement(sql1)) {
    
    
        ps.executeUpdate();
    }

    try (PreparedStatement ps = c.prepareStatement(sql2)) {
    
    
        ps.executeUpdate();
    }

    // 由于我们关闭了自动提交了,所以,所有的修改还没有真正地落盘
    c.commit();     // 只有加上这句话,才表示事务被提交了(数据真正落盘了)
}

volver al contenido...

2. Mecanismo de bloqueo

Sabemos que a nivel de lectura repetible, MySQL resuelve en cierta medida el problema de la lectura fantasma:

  • En el caso de lecturas instantáneas (sin bloqueos), mysql usa MVCC (control de concurrencia de múltiples versiones) para evitar lecturas fantasma.
  • En la situación de lectura actual (bloqueada), mysql usa la siguiente tecla para evitar la lectura fantasma.

2.1 Bloqueo de lectura, bloqueo de escritura

En términos del tipo de operación sobre los datos, los bloqueos se dividen en bloqueos de lectura y bloqueos de escritura:

  • Bloqueo de lectura : también se denomina bloqueo compartido. Cuando una transacción agrega un bloqueo de lectura, otras transacciones también pueden agregar un bloqueo de lectura o leer datos, pero no pueden realizar operaciones de escritura. Solo pueden esperar hasta que se liberen todos los bloqueos de lectura.
  • Bloqueo de escritura : también llamado bloqueo exclusivo. Cuando una transacción agrega un bloqueo de escritura, otras transacciones no pueden leer, escribir ni agregar ningún bloqueo. Solo pueden esperar a que la transacción actual libere el bloqueo.

2.2 Bloqueos globales, bloqueos de tabla, bloqueos de fila

Dividido del alcance del bloqueo, se divide en bloqueos globales, bloqueos de tabla y bloqueos de fila:

①Bloqueo global : el bloqueo actúa globalmente y todas las operaciones de toda la base de datos están restringidas por el bloqueo.

flush tables with read lock;

②Bloqueo de mesa : el bloqueo actúa en toda la mesa y todas las operaciones en la mesa estarán restringidas por el bloqueo.

lock table 表名称 read; -- 读锁
lock table 表名称 write; -- 写锁

-- 除了手动释放锁之外,当我们的会话结束后,锁也会被自动释放。
unlock tables;

③Bloqueo de fila : el bloqueo actúa en una determinada fila de la tabla y solo restringe la operación de una determinada fila a través del bloqueo (solo compatible con InnoDB)

-- 添加读锁(共享锁)
select * from 表名 where ... lock in share mode;
-- 添加写锁(排他锁)
select * from 表名 where ... for update;

volver al contenido...

2.3 Bloqueos de registros, bloqueos de espacios y bloqueos de teclas

Sabemos que InnoDB admite el uso de bloqueos de fila , pero los bloqueos de fila son más complicados. Se pueden dividir en varios tipos. Para obtener más información, consulte el artículo: Mecanismo de bloqueo de MySQL: bloqueos de registro, bloqueos de espacio y bloqueos de teclas

①Bloqueos de registro (Bloqueos de registro): solo se bloquea una fila de registros de índice y se bloquea un solo registro de índice. El bloqueo de registro siempre bloquea el índice, no el registro en sí. Por lo tanto, cuando un sql no usa ningún índice, se agregará un bloqueo de escritura detrás de cada índice agregado, similar a un bloqueo de tabla, pero en principio debería ser completamente diferente a un bloqueo de tabla.

  • La columna de identificación debe ser una columna de índice única o una columna de clave principal; de lo contrario, el bloqueo agregado se convertirá en un bloqueo de clave temporal.
  • Al mismo tiempo, la declaración de consulta debe ser una coincidencia exacta (=), no >, <, como, etc., de lo contrario, degenerará en un bloqueo de teclas temporal.

②Gap Locks: solo bloquea un intervalo de índice (intervalo abierto). Bloquee el espacio entre los registros de índice, o bloquee antes o después de un registro de índice, sin incluir el registro de índice en sí. Por ejemplo, en 1 y 2, los valores posibles de los bloqueos de espacio son (-∞, 1), (1, 2), (2, +∞). Los bloqueos de espacio se pueden usar para evitar la lectura fantasma y garantizar que los datos no se insertará entre índices.

  • Para el índice de clave principal: la consulta precisa de columnas existentes solo generará bloqueos de registros; la consulta precisa de columnas inexistentes generará bloqueos de registros y bloqueos de espacios; la consulta de rango generará bloqueos de espacios.
  • Para índices ordinarios: no importa qué tipo de consulta, siempre que se agregue el bloqueo, se generará un bloqueo de brecha.
    inserte la descripción de la imagen aquí

③Siguiente - Bloqueos de teclas: Record lock + Gap lock , abrir a la izquierda y cerrar a la derecha . De manera predeterminada, InnoDB usa exactamente los bloqueos de tecla siguiente para bloquear registros (por ejemplo select … for update, .

También se transformará de manera flexible según la escena:

Escenas convertir
Coincidencia exacta usando un índice único, pero el registro no existe en la tabla Conversión automática a Gap Locks
Use un índice único para una coincidencia exacta y exista un registro en la tabla Conversión automática a bloqueos de registro
Use un índice no único para la coincidencia exacta no convertir
Coincidencia de rango usando índices únicos No convierta, solo bloquee el límite superior, no el límite inferior

volver al contenido...


Resumen :
Sugerencia: Aquí hay un resumen del artículo:
Este artículo es un estudio de MySQL Primero, aprendí las cuatro características de las transacciones, los niveles de aislamiento y cómo iniciar transacciones. También aprendí el mecanismo de bloqueo y aprendí sobre bloqueos de lectura y escritura, bloqueos de tablas de filas, bloqueos de registros, etc. ¡El siguiente contenido de aprendizaje continuará actualizándose! ! !

Supongo que te gusta

Origin blog.csdn.net/qq15035899256/article/details/130003231
Recomendado
Clasificación