sql >> Base de Datos >  >> RDS >> MariaDB

Comprender la granularidad de bloqueo en MySQL

Si ha estado trabajando con MySQL durante algún tiempo, probablemente haya escuchado los términos "bloqueo a nivel de tabla" y "bloqueo a nivel de fila". Estos términos se refieren a la granularidad de bloqueo en MySQL; en este blog explicaremos qué significan y para qué se pueden utilizar.

¿Qué es la granularidad de bloqueo en MySQL?

Cada motor de almacenamiento MySQL admite diferentes niveles de granularidad para sus bloqueos. MySQL tiene tres niveles de bloqueo:bloqueo a nivel de fila, bloqueo a nivel de página y bloqueo a nivel de tabla. Cada motor de almacenamiento MySQL implementa el bloqueo de manera diferente, lo que le brinda ventajas y desventajas distintas. Primero veremos qué es la granularidad de bloqueo, luego veremos cómo funciona todo en diferentes motores de almacenamiento.

En términos generales, los bloqueos en MySQL pertenecen a una de estas categorías. Los candados pueden ser:

  • Nivel de página:estos tipos de granularidades de bloqueo estaban disponibles en motores más antiguos de MySQL, específicamente BDB, que es ahora obsoleto a partir de MySQL 5.1. En resumen, BDB era un motor de almacenamiento incluido en las versiones anteriores de MySQL y era un motor de almacenamiento transaccional que realizaba bloqueos a nivel de página. Dado que estos tipos de granularidades de bloqueo ya no se usan, no profundizaremos en ellas aquí, pero en general, estos bloqueos se limitan a los datos e índices que residen en una página en particular. Si desea obtener más información sobre BDB, la página en MariaDB debería proporcionar más información.

  • Nivel de tabla:MySQL utiliza el bloqueo a nivel de tabla para todos los motores de almacenamiento excepto InnoDB.

  • Nivel de fila:InnoDB utiliza el bloqueo de nivel de fila.

Ventajas y desventajas del bloqueo a nivel de tabla

MySQL usa el bloqueo a nivel de tabla para todos los motores de almacenamiento excepto InnoDB, lo que significa que el bloqueo a nivel de tabla se usa para las tablas que ejecutan los motores de almacenamiento MyISAM, MEMORY y MERGE, lo que permite que solo una sesión actualice las tablas a la vez . Los bloqueos de nivel de tabla tienen algunas ventajas claras sobre los bloqueos de nivel de fila (por ejemplo, el bloqueo de nivel de tabla en general requiere un poco menos de memoria que el bloqueo de nivel de fila porque el bloqueo de nivel de fila requiere algo de memoria por fila (o grupo) de filas que están bloqueados y generalmente es rápido porque solo hay un bloqueo involucrado. Los bloqueos de escritura de tabla se colocan en una tabla si no hay bloqueos en ella; si hay bloqueos preexistentes en la tabla en cuestión, las solicitudes de bloqueo de tabla se colocan en la cola de solicitud de lectura. Vale la pena mencionar que el bloqueo a nivel de tabla también tiene algunas desventajas distintivas exclusivas de sí mismo; por ejemplo, podría no ser muy adecuado para aplicaciones que requieren muchas transacciones que van y vienen (por ejemplo, , una aplicación de banca en línea) porque solo una sesión puede escribir en una tabla a la vez y algunas de las tablas que admiten el bloqueo a nivel de tabla (como MyISAM) no admiten el modelo ACID.

Aquí hay un ejemplo:imagine una aplicación bancaria que usa dos tablas en una base de datos; digamos que esas tablas se llaman "cheques" y "ahorros". Debe mover $ 100 de la cuenta corriente de una persona a su cuenta de ahorros. Lógicamente, realizarías los siguientes pasos:

  1. Asegúrese de que el saldo de la cuenta sea superior a $100.

  2. Reste $100 de la cuenta corriente.

  3. Agregue $100 a la cuenta de ahorros.

Para realizar estas acciones, necesitaría un par de consultas, por ejemplo:

SELECT balance FROM checking WHERE account_id = 123;
UPDATE checking SET balance = balance - 100 WHERE account_id = 123;
UPDATE savings SET balance = balance + 100 WHERE account_id = 123;

Estas consultas pueden parecer simples, pero si usa MyISAM (usamos MyISAM como ejemplo, ya que es uno de los principales motores de almacenamiento que admite bloqueos a nivel de tabla), debe estar familiarizado con el hecho de que el motor tampoco es compatible con ACID, lo que significa que si el servidor de la base de datos falla al realizar cualquiera de esas consultas, no tendrá suerte:las personas podrían terminar con efectivo en ambas cuentas o en ninguna de ellas. El único motor que admite transacciones basadas en ACID en MySQL es InnoDB, por lo que si necesita muchas transacciones confiables, podría valer la pena investigarlo. InnoDB también admite el bloqueo a nivel de fila; esto es lo que veremos ahora.

Ventajas y desventajas del bloqueo a nivel de fila

MySQL usa el bloqueo de nivel de fila para las tablas de InnoDB para admitir el acceso de escritura simultáneo por varias sesiones. Algunas de las ventajas de usar el bloqueo a nivel de fila incluyen la capacidad de bloquear una sola fila durante largos períodos de tiempo y menos conflictos de bloqueo cuando muchos subprocesos acceden a diferentes filas. Sin embargo, el bloqueo a nivel de fila también tiene desventajas:una de ellas es que el bloqueo a nivel de fila generalmente ocupa más memoria que el bloqueo a nivel de página o de tabla, también suele ser más lento que los bloqueos a nivel de página o de tabla porque el motor debe adquirir más cerraduras. InnoDB es uno de los motores que admite un mecanismo de bloqueo de nivel de fila:también es compatible con ACID, lo que significa que se adapta bien a las aplicaciones basadas en transacciones (consulte el ejemplo anterior). Ahora veremos cómo funciona la granularidad de bloqueo en uno de los motores de almacenamiento de MySQL.

¿Cómo funciona la granularidad de bloqueo en InnoDB?

InnoDB es ampliamente conocido por admitir el bloqueo de nivel de fila, pero también vale la pena señalar que el motor admite varios tipos de bloqueo, lo que significa que puede usar bloqueos de nivel de fila y de tabla. InnoDB realiza el bloqueo a nivel de fila al establecer bloqueos compartidos o exclusivos en los registros de índice que encuentra cuando busca o escanea un índice de tabla. Un bloqueo compartido es un bloqueo que permite que la transacción que mantiene el bloqueo lea la fila en cuestión; por otro lado, un bloqueo exclusivo permite que la transacción que mantiene el bloqueo actualice o elimine una fila.

InnoDB también tiene otros tipos de bloqueos, algunos de ellos incluyen bloqueos compartidos y exclusivos, bloqueos de intención, bloqueos de registro, bloqueos de brecha, bloqueos de tecla siguiente y bloqueos de intención siguiente. Los bloqueos de intención, por ejemplo, también pueden ser compartidos o exclusivos; dichos bloqueos generalmente indican que una transacción tiene la intención de establecer un determinado tipo de bloqueo (un bloqueo compartido o un bloqueo exclusivo) en filas individuales de una tabla, un bloqueo de registro es un bloqueo en un registro de índice, etc.

En general, la granularidad de bloqueo de InnoDB difiere de la granularidad de bloqueo presente en otros motores de almacenamiento de MySQL (por ejemplo, MyISAM) porque cuando se usa el bloqueo a nivel de tabla, solo una sesión para actualizar ciertas tablas a la vez. el tiempo puede correr. Cuando se utiliza el bloqueo de nivel de fila, MySQL admite el acceso de escritura simultáneo en varias sesiones, lo que convierte a los motores de almacenamiento de bloqueo de nivel de fila (InnoDB) en una opción adecuada para aplicaciones de misión crítica.

Granularidad de bloqueo y interbloqueos

La granularidad de bloqueo y los niveles de bloqueo en MySQL pueden ser una gran cosa, pero también pueden causar problemas. Uno de los problemas más frecuentes causados ​​por la granularidad de los bloqueos son los interbloqueos:un interbloqueo ocurre cuando diferentes transacciones de MySQL no pueden continuar porque cada una de ellas tiene un bloqueo que la otra necesita. Afortunadamente, cuando se utiliza el motor de almacenamiento InnoDB, la detección de interbloqueos está habilitada de forma predeterminada; cuando se detecta un interbloqueo, InnoDB revierte automáticamente una transacción. Si encuentra interbloqueos al tratar con la granularidad de bloqueo en MySQL, no se preocupe, considere simplemente reiniciar su transacción. Para monitorear proactivamente su base de datos, también debe considerar utilizar las funciones proporcionadas por ClusterControl.

¿Cómo puede ayudarle ClusterControl?

Estas son algunas de las cosas con las que ClusterControl desarrollado por Variousnines puede ayudarlo:

  • La protección de todos los datos de su empresa

    • Si sus datos están dañados (eso puede deberse a que no usa un motor de almacenamiento compatible con ACID o también a otros factores como se describe anteriormente), la herramienta puede ejecutar un proceso automático que realmente verifica que puede recuperar sus datos.

    • La herramienta puede informarle qué bases de datos no están respaldadas o mostrarle el estado de sus copias de seguridad (si tuvieron éxito o fracasaron)

  • La automatización de las operaciones de su base de datos

    • ClusterControl puede ayudarlo a garantizar que sus administradores de sistemas, desarrolladores y administradores de bases de datos administren clústeres de bases de datos completos de manera eficiente con riesgos mínimos utilizando la industria mejores prácticas

  • Gestión eficaz de la infraestructura de su base de datos en general

    • El cambio tecnológico actual combinado con soluciones de infraestructura sofisticadas requiere herramientas y conocimientos avanzados para lograr una alta disponibilidad y un rendimiento óptimo para sus aplicaciones críticas para el negocio. ClusterControl también puede ayudarlo con la implementación, el monitoreo, la administración y el escalado de las tecnologías de base de datos de código abierto más populares, incluidas MySQL, MariaDB, MongoDB, PostgreSQL, TimeScaleDB y el resto.

Para obtener más información sobre cómo ClusterControl puede ayudarlo a optimizar sus operaciones comerciales, asegúrese de estar atento al blog de la base de datos de Variousnines.

Resumen

Diferentes motores de almacenamiento MySQL tienen diferentes tipos de granularidades de bloqueo disponibles. Antes de decidir sobre el motor de almacenamiento que debe usar, asegúrese de conocer la mayor cantidad de información posible sobre el motor de almacenamiento en cuestión (por ejemplo, como ya se señaló, MyISAM debe evitarse cuando se trata de datos de misión crítica porque no es compatible con ACID), comprenda todas las implicaciones de rendimiento relacionadas, incluidas las granularidades de bloqueo, interbloqueos y el resto, y elija sabiamente.