Preguntas de la entrevista JavaMySQL, ¿cómo escribir una actualización para evitar bloqueos de tablas?

¡Obtenga información técnica sobre productos secos e información de la industria por primera vez!

Preguntas de la entrevista JavaMySQL, ¿cómo escribir una actualización para evitar bloqueos de tablas?

Anteriormente, recomendé el curso de alta concurrencia de Java para Geek Time. Muchas personas se basaron en este artículo "Hoja de ruta de aprendizaje de alta concurrencia de Java 2019 y 50 preguntas de la entrevista que deben cumplirse". "Compré el curso, ¡espero que puedan verlo con atención! ¡No malgastes dinero!

Hoy hablaré sobre otra pregunta de la entrevista. ¿Por qué se recomienda tener una clave principal en la condición where en la declaración de actualización de MySQL?

Amigos que ven esta pregunta, creo que muchas personas tienen preguntas, ¿no puedo actualizar dónde sin agregar una clave principal?

No, se puede actualizar y utilizar. Pero no te recomiendo que hagas esto. Porque la mayoría de nosotros usamos MySQL para usar el motor de almacenamiento innodb, que admite transacciones. Si su condición where no agrega una clave principal, entonces el bloqueo de nivel de fila de InnoDB puede convertirse en un bloqueo de nivel de tabla. Si actualiza a bloqueos a nivel de tabla, la simultaneidad se reducirá considerablemente.

Preguntas de la entrevista JavaMySQL, ¿cómo escribir una actualización para evitar bloqueos de tablas?

Algunos internautas comentaron anteriormente en mi artículo que la actualización de los bloqueos de fila a bloqueos de tabla está relacionada con el nivel de aislamiento de las transacciones, porque el aislamiento de las transacciones se logra mediante el bloqueo, y el bloqueo inadecuado afectará inevitablemente la concurrencia.

Diferentes bloqueos admiten diferente simultaneidad. El tipo de bloqueo que se agrega al final tiene una gran relación con el índice, por lo que se puede decir que el tipo de índice que se usa determina cuánta simultaneidad se admite.

Hay tres tipos de índices de uso común: claves primarias, índices únicos e índices ordinarios. No entraré en detalles sobre la clave principal. Viene con el atributo de índice más eficiente; el índice único se refiere a la tasa de repetición del valor del atributo es 0, que generalmente se puede usar como clave principal de negocio, como el número de pedido; la diferencia entre el índice ordinario y el primero es que el valor del atributo La tasa de repetición es mayor que 0 y no se puede utilizar como la única condición especificada, como el nombre del usuario comprador. Hoy quiero hablar principalmente sobre "el impacto de los índices ordinarios en la concurrencia".

Si no hay un índice, no hablaré de él. Definitivamente es un desastre para la concurrencia, y los puntos muertos probablemente sean comunes.

¿Por qué recomiendo agregar la clave principal a la condición where en la actualización?

Debido a que la clave principal es un índice único, también puede usar otros índices únicos, pero para las tablas normales, solo la clave principal puede ser única. Por lo tanto, le sugiero que recuerde agregar la clave principal al actualizar.

Solo necesita recordar que la clave principal y el índice único son bloqueos de fila, y otros índices no son necesariamente bloqueos de fila, pero pueden ser bloqueos de tabla. De esta forma, la probabilidad de un punto muerto es muy alta y también se reduce la concurrencia.

Tomemos un ejemplo simple para observar la situación de los índices ordinarios.

Las declaraciones, índices y datos relacionados con la creación de tablas son los siguientes:

Preguntas de la entrevista JavaMySQL, ¿cómo escribir una actualización para evitar bloqueos de tablas?

Luego cancele la confirmación de transacción automática set autocommit = off;

Cuando la tasa de repetición del tiempo de creación en nuestra tabla es relativamente alta. Abra dos ventanas y dos transacciones respectivamente.

Preguntas de la entrevista JavaMySQL, ¿cómo escribir una actualización para evitar bloqueos de tablas?

Para la demostración, puede agregar más datos, como 100,000 piezas de datos para 03-01 y 03-02.

Ejecute el SQL en las dos ventanas a su vez, y encontrará que la actualización en una de las ventanas ha fallado. inmediato:

Preguntas de la entrevista JavaMySQL, ¿cómo escribir una actualización para evitar bloqueos de tablas?

Parece que estas dos transacciones no interfieren entre sí, pero después de que una de las transacciones no actualiza los datos bloqueados por sí misma, debería poder indicar que el bloqueo de la tabla se activa en este momento. Esto es en el caso de un índice de clave no principal o un índice único, y la cantidad de repetición de datos del índice es relativamente alta, su actualización se bloqueará. ¡La simultaneidad se reducirá enormemente!

Puede intentarlo, si utiliza la clave principal o el índice único en este momento, ¿será este el caso?

Preguntas de la entrevista JavaMySQL, ¿cómo escribir una actualización para evitar bloqueos de tablas?

En nuestro sistema de comercio electrónico, no existen muchos códigos de este tipo. Algunas anomalías inexplicables a menudo ocurren en algunos productos y actividades populares, como picos, descuentos, descuentos, etc., lo que reduce considerablemente la experiencia del usuario.

En los datos de prueba anteriores, los borra todos y luego agrega algunos datos. En estos datos, si la tasa de repetición de create_time es 0, encontrará que ambas transacciones son exitosas. Esto muestra que deberían usar bloqueos de nivel de fila en este momento, lo cual es más eficiente.

Arriba, la prueba muestra que al actualizar los datos, intente utilizar la clave principal o el índice único. Pero no hay muchos índices únicos para cada tabla, y la clave principal debe ser para cada tabla. Por lo tanto, le sugiero que siempre traiga la clave principal cuando actualice los datos.
Preguntas de la entrevista JavaMySQL, ¿cómo escribir una actualización para evitar bloqueos de tablas?

Supongo que te gusta

Origin blog.51cto.com/15127565/2666939
Recomendado
Clasificación