base de datos mysql | MVCC

base de datos mysql | MVCC

Este artículo se refiere al autoconocimiento

MVCC (Multi-Version Concurrency Control)multi-versión de protocolo de control de concurrencia-MVCC

Motor de almacenamiento MySQL InnoDB, que se basa en mvcc

La mayor ventaja de MVCC: leer sin bloqueo, leer y escribir sin conflictos . En aplicaciones OLTP con más lecturas y menos escrituras, es muy importante que las lecturas y escrituras no entren en conflicto, lo que aumenta enormemente el rendimiento concurrente del sistema, por eso en esta etapa, casi todos los RDBMS soportan MVCC.

1. Escenarios de aplicación MVCC

El motor InnoDB en MySQL es compatible con MVCC;

应对高并发事务, MVCC 比单纯的加行锁更有效, 开销更小;

MVCC solamente 读已提交(Read Committed)y 可重复读(Repeatable Read)la función de nivel de aislamiento, y los otros dos niveles de aislamiento MVCC incompatibles; (Serializable para el nivel de aislamiento, se accede a los datos bloqueando un mutex, por lo que no MVCC)

MVCC se puede implementar en base a un bloqueo optimista y pesimista.

2. ¿Qué problemas puede resolver MVCC?

  • El problema del bloqueo entre lecturas y escrituras: a través de MVCC, las lecturas y escrituras no se pueden bloquear entre sí, las lecturas no se bloquean entre sí y las escrituras no bloquean las lecturas, lo que puede mejorar las capacidades de procesamiento concurrente de datos.
  • Reducción de la probabilidad de interbloqueo: Esto se debe a que MVCC utiliza un método de bloqueo optimista. Al leer datos, no hay necesidad de bloquear, y solo es necesario bloquear las filas necesarias para las operaciones de escritura.
  • Resuelva el problema de la lectura consistente: cuando miramos una instantánea de una base de datos en un momento determinado, solo podemos ver el resultado de la actualización de la confirmación de la transacción antes de este momento, y no podemos ver el resultado de la actualización de la confirmación de la transacción. después del punto en el tiempo.

3. Lectura de instantánea y lectura actual

3.1 Lectura de instantánea

Lectura de instantáneas, lectura de datos de instantáneas, simple Seleccionar sin bloqueo es una lectura de instantáneas.

SELECT * FROM player WHERE ...

3.2 Lectura actual

La lectura actual significa leer los datos más recientes, no los datos históricos. Un SELECT bloqueado o agregar, eliminar o modificar datos realizará la lectura actual.

SELECT * FROM player LOCK IN SHARE MODE;
SELECT FROM player FOR UPDATE;
INSERT INTO player values ...
DELETE FROM player WHERE ...
UPDATE player SET ...

4. Principio MVCC

De hecho, el principio de MVCC es Leer vista y deshacer registro

4.1 Número de versión de la transacción

Cada vez que se abre un registro, se obtiene un ID de transacción (también conocido como número de versión de transacción ) de la base de datos . Este ID de transacción aumenta automáticamente y la secuencia de tiempo de la transacción se puede juzgar por el tamaño del ID.

4.2 Columnas ocultas de registros de filas

  1. row_id : ID de fila oculta, que se utiliza para generar el índice agrupado predeterminado. Si el índice agrupado no se especifica al crear la tabla de datos, InnoDB utilizará este ID oculto para crear el índice agrupado. El uso de índices agrupados puede mejorar la eficiencia de la búsqueda de datos.
  2. trx_id : el ID de transacción de esta operación de datos, que es el último ID de transacción que insertó o actualizó los datos.
  3. roll_ptr : puntero de retroceso , que apunta a la información del registro de deshacer de este registro.
    Inserte la descripción de la imagen aquí

4.3 Deshacer registro

InnoDB guarda la instantánea del registro de fila en Undo Log.
Inserte la descripción de la imagen aquí
Las filas de datos están conectadas en serie a través de la estructura de la lista vinculada a través de los registros de instantáneas. Cada instantánea guarda el ID de transacción trx_id. Si desea encontrar la instantánea histórica, puede encontrarla atravesando el puntero de retroceso.

4.4 Vista de lectura

Si una transacción necesita consultar registros de fila, ¿qué versión del registro de fila debe leerse? Leer Vista es resolver este problema. Read View puede ayudarnos a resolver problemas de visibilidad. La vista de lectura guarda una lista de todas las transacciones activas cuando se inicia la transacción actual . Desde otra perspectiva, se puede entender como: La vista de lectura guarda una lista de otros ID de transacción que esta transacción no debería ver.

Hablando de personas: todas las transacciones en curso están en Vista de lectura

Campo:

  • trx_ids : el conjunto de ID de transacciones actualmente activos en el sistema.
  • low_limit_id : el ID de transacción más grande de las transacciones activas.
  • up_limit_id : el ID de transacción más pequeño entre las transacciones activas.
  • creator_trx_id : el ID de la transacción que creó este ReadView.

Inserte la descripción de la imagen aquí

Si el creator_trx_id de la transacción actual quiere leer un registro de fila, trx_id de este ID de registro de fila, habrá las siguientes situaciones:

  1. Si trx_id < 活跃的最小事务ID(up_limit_id), es decir, este registro de fila se ha comprometido antes de la creación de estas transacciones activas, entonces este registro de fila es visible para la transacción actual.
  2. Si trx_id > 活跃的最大事务ID(low_limit_id)este registro de línea descriptiva se crea después de estas transacciones activas, significa que este registro de línea no es visible para la transacción actual.
  3. Si up_limit_id < trx_id <low_limit_idsignifica que el registro debe estar en la colección trx_ids, es posible que aún esté activo, por lo que debemos recorrer la colección trx_ids, si trx_id existe en la colección trx_ids, demuestra que la transacción trx_id aún está activa e invisible. de lo contrario, trx_id no existe en la colección trx_ids, lo que indica que la transacción trx_id se ha enviado y esta fila de registros es visible.

4.5 ¿El proceso específico de consulta de un registro?

  1. Obtenga el número de versión de la transacción en sí, es decir, el ID de la transacción
  2. Obtener vista de lectura
  3. Consulte los datos obtenidos y luego compare los números de versión de la transacción en la Vista de lectura.
  4. Si no cumple con las reglas de ReadView, entonces se requiere una instantánea histórica en UndoLog;
  5. Finalmente, devuelva datos que cumplan con las reglas.

Control de múltiples versiones de InnoDB (MVCC) a través de la ReadView+ UndoLogrealización de
instantáneas históricas preservadas UndoLog, reglas de ReadView para ayudar a determinar si la versión actual de los datos es visible.

4.6 Resumen

Si el nivel de aislamiento de la transacción es ReadCommit, cada selección de una transacción comprobará ReadView una vez y la vista de lectura de cada consulta es diferente, lo que puede provocar lecturas no repetibles o lecturas fantasmas.
Si el nivel de aislamiento de la transacción es legible, para evitar lecturas no legibles, una transacción solo obtendrá la vista de lectura una vez en la primera selección, y luego la selección del índice posterior reutilizará la vista de lectura.

Supongo que te gusta

Origin blog.csdn.net/weixin_40597409/article/details/115369183
Recomendado
Clasificación