MySql-locks y cosas

cerrar con llave

Introducción a las cerraduras

¿Por qué necesito un candado?

Cuando compras un producto en Taobao, solo hay un producto en stock. Si otra persona lo compra en este momento, ¿cómo resolver el problema de si lo compraste tú o si lo compró otra persona?

El concepto de bloqueo

  • Un bloqueo es un mecanismo para que una computadora coordine múltiples procesos o subprocesos para acceder simultáneamente a un determinado recurso.
  • En una base de datos, los datos también son un recurso compartido por muchos usuarios. Cómo garantizar la coherencia y la eficacia del acceso simultáneo a los datos es un problema que todas las bases de datos deben resolver, y los conflictos de bloqueo también son un factor importante que afecta el rendimiento del acceso simultáneo a la base de datos.
  • Los bloqueos son especialmente importantes para las bases de datos y son más complicados.

Bloqueos en MySQL

  • Bloqueos a nivel de tabla: baja sobrecarga y bloqueo rápido; sin interbloqueos; gran granularidad de bloqueo, la mayor probabilidad de conflictos de bloqueo y la menor concurrencia.
  • Bloqueos a nivel de fila: alta sobrecarga y bloqueo lento; se producirán interbloqueos; la granularidad de bloqueo es la más pequeña, la probabilidad de conflictos de bloqueo es la más baja y la concurrencia es la más alta.
  • Bloqueos de página (bloqueos de espacio, bloqueos de espacio): la sobrecarga y el tiempo de bloqueo son entre bloqueos de tabla y bloqueos de fila; se producirán interbloqueos; la granularidad de bloqueo es entre bloqueos de tabla y bloqueos de fila, y el grado de concurrencia es promedio.

Escenarios de uso de bloqueo de tabla y bloqueo de fila

Los bloqueos a nivel de tabla son más adecuados para aplicaciones que se centran en consultas y solo se actualiza una pequeña cantidad de datos según las condiciones del índice. Por ejemplo, los
bloqueos a nivel de fila del sistema OLAP son más adecuados para aplicaciones que tienen una gran cantidad de actualizaciones simultáneas de una pequeña cantidad de datos diferentes según las condiciones del índice y las consultas simultáneas, como algunos sistemas de procesamiento de transacciones en línea (OLTP).
Es difícil decir qué cerradura es mejor en general, solo qué cerradura es más adecuada en términos de las características de aplicaciones específicas

Bloqueo MyISAM

El bloqueo a nivel de tabla de MySQL tiene dos modos:
bloqueo de lectura compartido de tabla (bloqueo de lectura de tabla)
bloqueo de escritura exclusivo de tabla (bloqueo de escritura de tabla)
Inserte la descripción de la imagen aquí

Bloqueo de lectura compartido

Sintaxis: lock table table name read

  1. lock table testmysam READIniciar otra sesión select * from testmysampara consultar
  2. insert into testmysam value(2); update testmysam set id=2 where id=1;Dado
    3. En otra sesión de
    insert into testmysam value(2);espera
    4. En la misma sesión de un error
    insert into account value(4,'aa',123);dado 5. En otra sesión con éxito 6. En la misma sesión bloquear error bloquear tabla de alias de tabla como Lectura;
    select * from account ;

    insert into account value(4,'aa',123);
    select s.* from testmysam s

Cadena de fotos exclusiva

1. lock table testmysam WRITE
En la misma sesión

insert testmysam value(3);
delete from testmysam where id = 3 
select * from testmysam 

2. Operar en diferentes tablas (informe de errores)

select s.* from testmysam s 
insert into account value(4,'aa',123); 

3. En otras sesiones (en espera)

select * from testmysam

para resumir:

  • Los bloqueos de lectura, las operaciones de lectura en tablas MyISAM, no bloquearán las solicitudes de lectura de otros usuarios a la misma tabla, pero bloquearán las solicitudes de escritura a la misma tabla
  • Bloqueo de lectura, operación de lectura en la tabla MyISAM, no bloqueará la sesión actual para leer la tabla, cuando se modifique la tabla, se informará un error
  • Bloqueo de lectura, una sesión usa el comando LOCK TABLE para agregar un bloqueo de lectura a la tabla F. Esta sesión puede consultar los registros en la tabla bloqueada, pero las actualizaciones o el acceso a otras tablas provocarán errores;
  • Bloqueo de escritura, operación de escritura en la tabla MyISAM, bloqueará a otros usuarios para que no lean y escriban la misma tabla;
  • Escribir bloqueo, escribir operaciones en tablas MyISAM, la sesión actual puede hacer CRUD en esta tabla, pero las operaciones en otras tablas reportarán un error

Bloqueo InnoDB

El motor InnoDB en mysql admite el bloqueo de filas

  • Los bloqueos compartidos también se denominan bloqueos de lectura. Cuando una transacción bloquea ciertas filas para lectura, otras transacciones pueden leer estas filas, pero no pueden realizar operaciones de escritura, ni otras transacciones pueden bloquear estas filas exclusivamente, pero se permiten bloqueos de lectura.
  • El bloqueo exclusivo también se llama: bloqueo de escritura. Cuando una transacción bloquea un cierto número de escrituras, otras transacciones no pueden escribir, pero sí pueden leer. No está permitido que otras transacciones coloquen bloqueos en estas filas. Incluyendo bloqueos de escritura.

gramática

La redacción de la cerradura compartida: lock in share mode
Por ejemplo: La redacción select * from 表 where 条件 lock in share mode;
de la cerradura exclusiva: for update
Por ejemplo:select * from 表 where 条件 for update;

Nota:

1. Dos transacciones no pueden bloquear el mismo índice.
2. Insertar, eliminar y actualizar agregará automáticamente bloqueos exclusivos de forma predeterminada en la transacción.
3. El bloqueo de fila debe tener un índice para lograrlo; de lo contrario, bloqueará automáticamente toda la tabla, entonces no es un bloqueo de fila.

  CREATE TABLE testdemo ( 
  `id` int(255) NOT NULL , 
  `c1` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , 
  `c2` int(50) NULL DEFAULT NULL , 
  PRIMARY KEY (`id`), INDEX `idx_c2` (`c2`) USING BTREE )ENGINE=InnoDB; 
  insert into testdemo VALUES(1,'1',1),(2,'2',2);
  1. BEGIN select * from testdemo where id =1 for update
    En otra sesión en update testdemo set c1 = '1' where id = 2el éxito de la
    update testdemo set c1 = '1' where id = 1espera
  2. BEGIN update testdemo set c1 = '1' where id = 1
    En otra sesión de update testdemo set c1 = '1' where id = 1espera
  3. BEGIN update testdemo set c1 = '1' where c1 = '1'
    En otra sesión de update testdemo set c1 = '2' where c1 = '2'espera
  4. La primera sesión de la select * from testdemo where id =1 for update
    segunda sesión de select * from testdemo where id =1 lock in share mode
    regreso a la primera sesión UNLOCK TABLES no desbloqueará
    la confirmación o comenzará o ROLLBACK se desbloqueará
  5. Mira la siguiente tabla. Bloquear
    tabla testdemo WRITE
    use commit, ROLLBACK no se desbloqueará.
    Use UNLOCK TABLES o begin se desbloqueará

Problema de espera de bloqueo

Bueno, después de dominar lo anterior, su comprensión de los bloqueos ha superado la de muchos compañeros. Ahora, un problema práctico es que una pieza de datos a menudo se bloquea durante el trabajo, lo que hace que otras operaciones sean completamente imposibles de realizar.

Debe haber encontrado este problema. Al depurar un programa, algunos programadores a menudo bloquean parte de los datos de la base de datos. En este momento, también necesita depurar esta parte de la función, pero descubre que el código siempre se ejecuta con el tiempo. ¿Alguna vez lo ha hecho? Esto es un problema. De hecho, creo que usted también conoce la causa raíz de este problema.
Por ejemplo, hay dos sesiones.
Programador A, el código de depuración de integridad
BEGIN
SELECT * FROM testdemo WHERE id = 1 FOR UPDATE
La función que ha completado con integridad también debe pasar por esa parte del código, debe leer el bloqueo
BEGIN
SELECT * FROM testdemo WHERE id = 1 bloquear en modo compartir

Lamentablemente, en este momento, no sabe lo que sucedió. Siempre será una excepción de tiempo de espera durante su proceso de depuración. Este tipo de problema se puede encontrar en el desarrollo o en la operación real del proyecto, entonces, ¿cómo solucionar el problema? En realidad, se trata de un pequeño truco.

select * from information_schema.INNODB_LOCKS;

Inserte la descripción de la imagen aquí
Es genial. Al menos descubrí a través de esta declaración SQL que hay dos bloqueos para los mismos datos en la misma tabla. Uno de ellos es X (bloqueo de escritura) y el otro es S (bloqueo de lectura). Puedo omitir este fragmento de datos. Usar otros datos para depurar. ¿
Quizás si no puedo moverme, debo usar estos datos? Dale un grito (qué persona malvada está en la mesa de depuración, por favor no la bloquees), bueno, esto es una broma, de hecho, hay una mejor manera de verlo.

select * from sys.innodb_lock_waits

Inserte la descripción de la imagen aquí
La instrucción sql que ejecuté ahora está ahí. También mire en la parte inferior, el comando kill. Puede eliminar completamente la instrucción sql bloqueada a través de la barra de interrupción en su trabajo, y puede continuar ejecutándola, pero este comando también debe usarse Sin embargo, si un colega está realizando una depuración más importante y usted lo mata, es posible que lo golpeen si se entera.

La solución anterior es buena, pero ¿y si su MySQL no es la versión 5.7? Es 5.6. No tienes una biblioteca del sistema en absoluto. Es difícil hacer esto en este momento, pero hay formas.

SELECT r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query, 
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread 
FROM 
information_schema.innodb_lock_waits w 
INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id 
INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;

Inserte la descripción de la imagen aquí
Mira si no lo has visto, ¿puedes también realizar un gran movimiento como matar a 29?

asuntos

Hoy en día, muchos software son multiusuario, multiprograma, multiproceso y puede haber muchas personas usando la misma tabla al mismo tiempo.Para mantener la consistencia de los datos, se propone el concepto de transacción.

A tiene que transferir dinero a B, la cuenta de A es de -1000 yuanes y la cuenta de B es de 1000 yuanes. Estas dos declaraciones de actualización deben ejecutarse en su totalidad, de lo contrario, es difícil para A deducir dinero y B no agrega dinero. tratar con.

¿Qué motor de almacenamiento admite transacciones?

  1. Compruebe si las transacciones son compatibles con la base de datos (soporte InnoDB).
show engines;
  1. ¿Compruebe el motor de almacenamiento predeterminado actual de mysql?
 show variables like '%storage_engine%'; 
  1. ¿Verificar el motor de almacenamiento de una mesa?
  show create table 表名 ; 
  1. ¿Para la modificación de la estructura de almacenamiento de la mesa?
    Crear una tabla InnoDB: Crear tabla… tipo = InnoDB; Alterar tabla table_name type = InnoDB;

Características de la transacción

Las transacciones deben tener 4 atributos: atomicidad, consistencia, aislamiento y durabilidad. Estos cuatro atributos se denominan comúnmente características ACID.

  • Atomicidad
  • Consistencia
  • Aislamiento
  • Durabilidad

Atomicidad

Una transacción debe considerarse como una unidad mínima indivisible. Todas las operaciones de la transacción completa se envían con éxito o fallan. Para una transacción, es imposible realizar solo una parte de las operaciones.
Xiao Ming le da dinero a Xiao Hong
1. Xiaoming bank La tarjeta deduce 500 yuanes
2 La tarjeta de banco Xiaohong aumenta en 500. La
transacción completa, ya sea todo se realiza correctamente o todo falla.

Consistencia

Consistencia significa que la transacción transforma la base de datos de un estado de consistencia a otro. La integridad de los datos en la base de datos no se destruye antes de que comience la transacción y después de que finalice.
Xiaohong le da dinero a Xiaoming
1. Tarjeta bancaria de Xiaohong Deduzca 500
2. Agregue 500 a
la tarjeta bancaria de Xiao Ming 2. Agregue 1000 a la tarjeta bancaria de Xiao Ming. El
dinero deducido (-500) y el dinero agregado (500) deben sumar 0

Durabilidad

Una vez confirmada la transacción, los cambios realizados se guardarán permanentemente en la base de datos. En este punto, incluso si el sistema falla, los datos modificados que se han enviado no se perderán, no está
completamente resuelto desde la perspectiva de la base de datos.

Aislamiento

La ejecución de una transacción no puede ser interferida por otras transacciones. Es decir, las operaciones internas de una transacción y los datos utilizados están aislados de otras transacciones concurrentes, y cada transacción ejecutada simultáneamente no puede interferir entre sí. (La ejecución paralela de la base de datos debería ser como la ejecución en serie)

  • Lectura no confirmada (LECTURA NO COMITADA) lectura sucia
  • READ COMMITED no se puede leer repetidamente
  • Lectura repetible (LECTURA REPETIBLE)
  • Serializable (SERIALIZABLE) El
    nivel de aislamiento de transacciones predeterminado de mysql es de lectura repetible
show variables like '%tx_isolation%';

Simultaneidad de transacciones

  • Lectura sucia: la transacción A lee los datos actualizados de la transacción B, y luego B revierte la operación, luego los datos leídos por A son datos sucios
  • Lectura no repetible: la transacción A lee los mismos datos varias veces y la transacción B actualiza y confirma los datos durante las lecturas múltiples de la transacción A. Como resultado, cuando la transacción A lee los mismos datos varias veces, los resultados son inconsistentes.
  • Lectura fantasma: el administrador del sistema A cambió las calificaciones de todos los estudiantes en la base de datos de calificaciones específicas a calificaciones ABCDE, pero el administrador del sistema B insertó un registro de calificaciones específicas en este momento. Cuando el administrador del sistema A terminó el cambio, encontró que todavía había Si no se cambia un registro, es como si se hubiera producido una ilusión, lo que se denomina lectura fantasma.

Es fácil confundir la lectura no repetible con la lectura fantasma. La lectura no repetible se enfoca en la modificación y la lectura fantasma se enfoca en agregar o borrar. Para resolver el problema de la lectura no repetible, solo necesita bloquear las filas que cumplen las condiciones, y para resolver la lectura fantasma, debe bloquear la tabla

Lectura no confirmada (LECTURA NO COMITADA) lectura sucia

show variables like '%tx_isolation%'; 
set SESSION TRANSACTION ISOLATION LEVEL read UNCOMMITTED;

En una sesión

start TRANSACTION 
update account set balance = balance -50 where id = 1

Consulta en otra sesión

select * from account

Revertir la transacción en la primera sesión

ROLLBACK
En la segunda sesión

select * from account

Los datos enviados se leen en otra sesión y esta parte de los datos son datos sucios

READ COMMITED no se puede leer repetidamente

show variables like '%tx_isolation%';
 set SESSION TRANSACTION ISOLATION LEVEL read committed;

En una sesión

start TRANSACTION 
update account set balance = balance -50 where id = 1

Consulta en otra sesión (los datos no han cambiado)

select * from account

Regrese a la primera sesión y revierta la transacción
commit
en la segunda sesión
select * from account(los datos han cambiado)

Lectura repetible (LECTURA REPETIBLE)

show variables like '%tx_isolation%';
 set SESSION TRANSACTION ISOLATION LEVEL repeatable read;

En una sesión

start TRANSACTION 
update account set balance = balance -50 where id = 1

Consulta en otra sesión (los datos no han cambiado)

select * from account

Revertir la transacción en la primera sesión

commit

En la segunda sesión
select * from account(los datos no han cambiado)

Serializable (SERIALIZABLE)

show variables like '%tx_isolation%'; 
set SESSION TRANSACTION ISOLATION LEVEL serializable;

1. Iniciar una transacción

begin select * from account #发现 3 条记录

2. Inicie otra transacción

begin select * from account #发现 3 条记录 也是 3 条记录
insert into account VALUES(4,'deer',500) #发现根本就不让插入
  1. Regrese a la primera confirmación de transacción

Supongo que te gusta

Origin blog.csdn.net/weixin_42292697/article/details/114081064
Recomendado
Clasificación