Puntos de conocimiento de la transacción de la base de datos.

1. ÁCIDO

  • Atomicidad (A): la transacción es la unidad más pequeña, ya sea exitosa o revertida.
  • Consistencia (C): antes de que comience la transacción y después de que termine, las restricciones de integridad de la base de datos no se rompen. La transacción permanece en un estado consistente antes y después, sin importar cuántas transacciones concurrentes haya en un momento dado. Una transacción es el cambio del estado de los datos, por lo que si las transacciones son concurrentes, el sistema también debe realizar estas operaciones de transacción en serie.
  • Aislamiento (I): cuando se accede a varias transacciones simultáneamente, las transacciones están aisladas y una transacción no debe afectar el rendimiento de otras transacciones. El aislamiento completo no es realista. El aislamiento completo requiere que la base de datos ejecute solo una transacción a la vez, lo que afectará seriamente el rendimiento.
  • Durabilidad (D): el resultado de la transacción no se puede perder.

En un entorno concurrente, el aislamiento de las transacciones es difícil de garantizar, lo que lleva a problemas de consistencia concurrente.

  • Lectura sucia: T1 modificó datos que T2 leyó antes de confirmar. Luego, T1 deshace la modificación y T2 lee los datos sucios.
  • Lectura no repetible: lectura T1-> modificación T2-> lectura T1 nuevamente.
  • Lectura fantasma: recuento de selección T1 () -> inserción T2-> los datos T1 son inexactos
  • Cambio perdido: cambio T1-> cambio T2 El cambio T1 no es válido

Para problemas simples de aislamiento de transacciones, podemos garantizar la consistencia de los datos estableciendo el nivel de aislamiento de transacciones, generalmente a través de la anotación @Transational para administrar transacciones. Utiliza el nivel de aislamiento predeterminado del motor de base de datos de forma predeterminada.

  • READ_UNCOMMITTED: nivel de lectura no autorizado
    • Las transacciones de lectura permiten otras transacciones de lectura y escritura, las transacciones de escritura no confirmadas prohíben otras transacciones de escritura (pero permiten otras transacciones de lectura). Puede prevenir el problema de perder cambios.
  • READ_COMMITTED: nivel de lectura autorizado
    • Las transacciones de lectura permiten otras transacciones de lectura y escritura, las transacciones de escritura no confirmadas prohíben otras transacciones de lectura y escritura. Puede evitar cambios perdidos y lecturas sucias.
  • REPEATABLE_READ: nivel de lectura repetible
    • Las transacciones de lectura prohíben otras transacciones de escritura (pero permiten otras transacciones de lectura), las transacciones de escritura no confirmadas prohíben otras transacciones de lectura y transacciones de escritura. Puede evitar cambios perdidos, lecturas sucias, lecturas no repetibles.
  • SERIALIZABLE: nivel de serialización
    • Uno por uno, paralelo a serie.

El nivel de aislamiento de la transacción de la base de datos generalmente se logra bloqueando o deshaciendo log + MVCC.

El siguiente enlace original

Implementación de bloqueo

  • Lectura no confirmada: una transacción de actualización A solo agrega un bloqueo de escritura cuando se modifican los datos. Una vez que se completa la escritura, se libera el bloqueo de escritura, incluso si la transacción A no se ha confirmado. Por lo tanto, cuando la transacción B lee la misma fila, puede leer los datos modificados por la transacción A.

  • Confirmar lectura: una transacción de actualización A solo agrega un bloqueo de escritura cuando se modifican los datos, pero no libera el bloqueo de escritura hasta que la transacción A se confirma. Por lo tanto, cuando la transacción B, que se realiza al mismo tiempo, desea leer la misma fila de datos, será bloqueada por el bloqueo de escritura de la transacción A, por lo que se resuelve el problema de la lectura sucia.

  • Lectura repetible: bajo este nivel de aislamiento, además del método de bloqueo de escritura para confirmar lecturas, después de leer una fila de datos, se agrega un bloqueo de lectura a esta fila de datos hasta que se confirme la transacción. Por ejemplo, la transacción A lee la línea con ID = 1 y luego agrega bloqueo de lectura para ID = 1. La transacción B también quiere actualizar ID = 1, en este momento la adquisición del bloqueo de escritura falla, por lo que antes de que se complete la transacción A, ninguna otra transacción puede modificar la línea ID = 1, por lo que se resuelve el problema de las lecturas repetidas

Aunque el bloqueo de lectura-escritura resuelve el problema de aislamiento, el bloqueo causará una gran cantidad de bloqueo y degradación del rendimiento. A veces, provocará un punto muerto. Para resolver el punto muerto, se debe agregar un mecanismo de detección de punto muerto y el rendimiento se reducirá aún más. Por lo tanto, se necesita una forma más eficiente de lograr el aislamiento.

Implementación MVCC

MVCC logra el
enlace original anterior

Publicado 21 artículos originales · ganó 24 · vistas 20,000 +

Supongo que te gusta

Origin blog.csdn.net/qq_30332665/article/details/105374874
Recomendado
Clasificación