[Intermedio] Análisis en profundidad del nivel de aislamiento de transacciones

[Intermedio] Análisis en profundidad del nivel de aislamiento de transacciones

Este artículo presenta los cuatro niveles de aislamiento de transacciones en detalle y utiliza ejemplos para ilustrar qué tipo de fenómeno de lectura pueden resolver los diferentes niveles. E introdujo el principio de realización de diferentes niveles de aislamiento en bases de datos relacionales.

En el DBMS, las transacciones aseguran que una secuencia de operaciones pueda ejecutarse todas o ninguna (atomicidad), de un estado a otro (consistencia). Porque el negocio satisface la durabilidad. Por lo tanto, una vez que se envía la transacción, los datos pueden conservarse y, dado que la transacción satisface el aislamiento, cuando varias transacciones procesan los mismos datos al mismo tiempo, varias transacciones directamente no se afectan entre sí, por lo que, En el proceso de operaciones concurrentes de múltiples transacciones, si el nivel de aislamiento no está bien controlado, pueden ocurrir fenómenos de lectura como lecturas sucias, lecturas no repetibles o lecturas fantasmas.

Entre los cuatro atributos ACID de las transacciones de bases de datos, el aislamiento es el más relajado. Puede utilizar el mecanismo de bloqueo de la base de datos o el mecanismo de control de simultaneidad de varias versiones para obtener un mayor nivel de aislamiento durante las operaciones de datos. Sin embargo, a medida que aumenta el nivel de aislamiento de la base de datos, la concurrencia de datos también disminuirá. Por lo tanto, cómo hacer una buena compensación entre concurrencia y aislamiento se ha convertido en un tema crucial.

En el desarrollo de software, existe una variedad de mejores prácticas para casi todos los tipos de problemas para nuestra referencia Muchos DBMS definen múltiples "niveles de aislamiento de transacciones" diferentes para controlar el grado de bloqueo y concurrencia.

Hay cuatro niveles de aislamiento estándar definidos por ANSI / ISO SQL, de mayor a menor: Serializable, Lecturas repetibles, Lectura confirmada, Lectura no confirmada.

A continuación se presentarán el concepto, el uso y los problemas de estos cuatro niveles de aislamiento de transacciones a su vez (fenómeno de lectura)

Leer sin compromiso


La lectura no confirmada (READ UNCOMMITTED) es el nivel de aislamiento más bajo. Por su nombre, podemos saber que bajo este nivel de aislamiento de transacciones, una transacción puede leer los datos no confirmados de otra transacción.

Situación de bloqueo de la base de datos de lectura no confirmada (principio de implementación)

La transacción no bloqueó los datos al leerlos.

Al modificar datos, solo agregue bloqueos compartidos de nivel de fila a los datos.
fenómeno:

Cuando la transacción 1 lee una fila de registros, la transacción 2 también puede leer y actualizar esta fila de registros (porque la transacción 1 no agrega ningún bloqueo a los datos)

Cuando la transacción 2 actualiza el registro, la transacción 1 vuelve a leer el registro y puede leer la versión modificada del registro de la transacción 2 (debido a que la transacción 2 solo agrega un bloqueo de lectura compartido, la transacción 1 puede agregar un bloqueo de lectura compartido para leer Datos), incluso si la modificación aún no se ha enviado.

Cuando la transacción 1 actualiza una fila de registros, la transacción 2 no puede actualizar esta fila de registros hasta el final de la transacción 1. (Debido a que los datos del par de transacciones agregan un bloqueo de lectura compartido, la transacción dos no puede agregar un bloqueo de escritura exclusivo para modificar los datos)

Por ejemplo

事务一 事务二
/* Query 1 */
 SELECT age FROM users WHERE id = 1;  
/* will read 20 */  

 /* Query 2 */ 
UPDATE users SET age = 21 WHERE id = 1;
 /* No commit here */
 /* Query 1 */
SELECT age FROM users WHERE id = 1;
/* will read 21 */  

 ROLLBACK;
/* lock-based DIRTY READ */

Lo siguiente es tomar prestado el ejemplo que di en el artículo Análisis del fenómeno de lectura de base de datos para ilustrar el aislamiento entre dos transacciones en el nivel de aislamiento de lectura no comprometida.

La transacción se consultó dos veces en total Durante las dos consultas, la transacción dos modificó los datos sin comprometerse. Pero la segunda consulta de la transacción uno encontró el resultado modificado de la transacción dos. En el análisis del fenómeno de lectura de bases de datos, introdujimos este fenómeno, al que llamamos lectura sucia.

Por lo tanto, las lecturas no confirmadas conducirán a lecturas sucias

Leer comprometido


READ COMMITTED también puede traducirse en lectura confirmada. También se puede analizar por nombre. En el proceso de modificación de datos en una transacción, si la transacción no se ha comprometido, otras transacciones no pueden leer los datos.

Estado de bloqueo de la base de datos para lectura de confirmación

La transacción agrega un bloqueo compartido a nivel de fila a los datos leídos actualmente (el bloqueo solo se agrega cuando se lee), una vez que se lee la fila, el bloqueo compartido a nivel de fila se libera inmediatamente;

En el momento en que una transacción actualiza ciertos datos (es decir, el momento en que ocurre la actualización), primero debe bloquearse con un bloqueo exclusivo de nivel de fila y no se liberará hasta el final de la transacción.

fenómeno:

La transacción 1 lee una fila de registros en todo el proceso, la transacción 2 puede leer la fila de registros (debido a que la transacción agrega bloqueos compartidos a nivel de fila a la fila de registros, la transacción dos también puede aumentar el intercambio de datos Bloquear para leer datos).

En el momento en que la transacción 1 lee una fila, la transacción 2 no puede modificar los datos de la fila, pero mientras la transacción 1 termine de leer los datos de la fila modificados, la transacción 2 puede modificar los datos de la fila. (Una transacción agregará un bloqueo compartido a los datos en el momento en que se leen, y ninguna otra transacción puede agregar un bloqueo exclusivo a la fila de datos. Sin embargo, tan pronto como la transacción termine de leer la fila de datos, se liberará el bloqueo compartido a nivel de fila. Una vez que se libere el bloqueo , La transacción dos puede agregar un bloqueo exclusivo a los datos y modificar los datos)

Cuando la transacción 1 actualiza una fila de registros, la transacción 2 no puede actualizar esta fila de registros hasta el final de la transacción 1. (Cuando la transacción uno actualiza los datos, agregará un bloqueo exclusivo a los datos de la fila y el bloqueo se liberará hasta que finalice la transacción. Por lo tanto, antes de que se confirme la transacción dos, la transacción uno puede leer los datos sin agregar un bloqueo compartido a los datos. Por lo tanto, enviar la lectura puede resolver el fenómeno de lectura sucia)

Por ejemplo

事务一 事务二
/* Query 1 */
 SELECT * FROM users WHERE id = 1;  

 /* Query 2 */ 
UPDATE users SET age = 21 WHERE id = 1;
 COMMIT;
 /* in multiversion concurrency control, or lock-based READ COMMITTED */ 
 /* Query 1 */
SELECT * FROM users WHERE id = 1;
 COMMIT; 
/*lock-based REPEATABLE READ */ 

En el nivel de aislamiento de lectura de confirmación, la transacción uno no puede leer datos antes de que se confirme la transacción dos. Solo después de que se confirme la transacción dos, la transacción uno puede leer los datos.

Pero del ejemplo anterior, también vemos que los resultados de una o dos lecturas de la transacción no son consistentes, por lo que enviar la lectura no puede resolver el fenómeno de las lecturas no repetibles.

En resumen, el nivel de aislamiento de lectura de confirmación asegura que cualquier lectura de datos sea información confirmada y evita lecturas sucias. Pero no hay garantía de que se puedan leer los mismos datos cuando se vuelve a leer la transacción, porque otras transacciones pueden modificar los datos que se acaban de leer después de cada lectura de datos.

Lecturas repetibles


Las lecturas repetibles (LECTURAS REPETIBLES), debido al nivel de aislamiento de lectura enviado, producirán lecturas no repetibles. Por lo tanto, un nivel de aislamiento que sea un nivel más alto que la lectura de confirmación puede resolver el problema de las lecturas no repetibles. Este nivel de aislamiento se llama Lectura repetible (¡¡Es este nombre muy caprichoso !!)

Situación de bloqueo de base de datos de lectura repetible

En el momento en que una transacción lee ciertos datos (es decir, el momento en que comienza a leer), primero se le debe agregar un bloqueo compartido a nivel de fila, y no se liberará hasta el final de la transacción;

En el momento en que una transacción actualiza ciertos datos (es decir, el momento en que ocurre la actualización), primero debe bloquearse con un bloqueo exclusivo de nivel de fila y no se liberará hasta el final de la transacción.

fenómeno

La transacción 1 lee una fila de registros en todo el proceso, la transacción 2 puede leer la fila de registros (debido a que la transacción agrega bloqueos compartidos a nivel de fila a la fila de registros, la transacción dos también puede aumentar el intercambio de datos Bloquear para leer datos).

La transacción 1 se encuentra en todo el proceso de lectura de una fila de registros, la transacción 2 no puede modificar los datos de esa fila (la transacción 1 agregará un bloqueo compartido a los datos durante todo el proceso de lectura, y el bloqueo no se liberará hasta que se confirme la transacción, por lo que todo el proceso, Ninguna otra transacción puede agregar un bloqueo exclusivo a la fila de datos. Por lo tanto, las lecturas repetibles pueden resolver el fenómeno de las lecturas no repetibles)

Cuando la transacción 1 actualiza una fila de registros, la transacción 2 no puede actualizar esta fila de registros hasta el final de la transacción 1. (Cuando la transacción uno actualiza los datos, agregará un bloqueo exclusivo a los datos de la fila y el bloqueo se liberará hasta que finalice la transacción. Por lo tanto, antes de que se confirme la transacción dos, la transacción uno puede leer los datos sin agregar un bloqueo compartido a los datos. Por lo tanto, enviar la lectura puede resolver el fenómeno de lectura sucia)

Por ejemplo

事务一 事务二
/* Query 1 */
 SELECT * FROM users WHERE id = 1; 
 COMMIT;    

 /* Query 2 */ 
UPDATE users SET age = 21 WHERE id = 1;
 COMMIT;
 /* in multiversion concurrency control, or lock-based READ COMMITTED */ 

En el ejemplo anterior, solo después de que se confirma la transacción uno, la transacción dos puede cambiar la fila de datos. Por lo tanto, siempre que el período desde el principio hasta el final de la transacción, no importa cuántas veces lea la fila de datos, el resultado es el mismo.

Del ejemplo anterior, podemos sacar una conclusión: el nivel de aislamiento de lectura repetible puede resolver el fenómeno de lectura no repetible. Pero en el nivel de aislamiento de la lectura repetible, hay otro fenómeno de lectura que no puede resolver, es decir, la lectura fantasma. Mira el siguiente ejemplo:

事务一 事务二
/* Query 1 */
 SELECT * FROM users WHERE age BETWEEN 10 AND 30;   

 /* Query 2 */ 
INSERT INTO users VALUES ( 3, 'Bob', 27 );
 COMMIT;
 /* Query 1 */
SELECT * FROM users WHERE age BETWEEN 10 AND 30;    

La ejecución y los fenómenos de las dos transacciones anteriores son los siguientes:

1. La primera condición de consulta de la transacción uno es la edad ENTRE 10 Y 30, si se trata de diez registros cumplen la condición. En este momento, agregará bloqueos compartidos de nivel de fila a los diez registros elegibles. Ninguna otra transacción puede cambiar estos diez registros.

2. La transacción dos ejecuta una declaración sql, el contenido de la declaración es insertar un dato en la tabla. Debido a que ninguna transacción agrega bloqueos a nivel de tabla a la tabla en este momento, la operación se puede ejecutar sin problemas.

3. Cuando la transacción uno ejecuta SELECT * FROM usuarios DONDE tienen entre 10 y 30 años, nuevamente, el resultado de los registros devueltos pasa a ser once, lo cual es un aumento del anterior, que es el que acaba de insertar la transacción dos.

Por lo tanto, los resultados de las dos consultas de rango de la transacción uno no son los mismos. Esta es la lectura fantasma que mencionamos.

Serializable (serializable)


Serializable (Serializable) es el nivel de aislamiento más alto. Todas las lecturas fantasma que no se pueden resolver con los niveles de aislamiento mencionados anteriormente se pueden resolver en el nivel de aislamiento serializable.

Hemos dicho que la razón de la lectura fantasma es que los bloqueos de rango (bloqueos de rango: use una cláusula "WHERE" para describir los bloqueos de rango en la consulta SELECT) no se agregan cuando la transacción está en la consulta de rango, lo que conduce a la lectura fantasma.

Situación de bloqueo de la base de datos serializable

Cuando una transacción lee datos, primero debe agregarle un bloqueo compartido a nivel de tabla y no lo liberará hasta el final de la transacción;

Cuando una transacción actualiza datos, primero debe agregarle un bloqueo exclusivo a nivel de tabla y liberarlo hasta el final de la transacción.

fenómeno

Cuando la transacción 1 lee los registros de la tabla A, la transacción 2 también puede leer la tabla A, pero no puede actualizar, agregar ni eliminar la tabla A hasta que finalice la transacción 1. (Debido a que la transacción agrega un bloqueo compartido a nivel de tabla a la tabla, otras transacciones solo pueden aumentar el bloqueo compartido para leer datos y no pueden realizar ninguna otra operación)

Cuando la transacción 1 está actualizando un registro en la tabla A, la transacción 2 no puede leer ningún registro en la tabla A y es imposible actualizar, agregar o eliminar la tabla A hasta el final de la transacción 1. (La transacción agrega bloqueos exclusivos a nivel de tabla a la tabla y otras transacciones no pueden agregar bloqueos compartidos o bloqueos exclusivos a la tabla y, por lo tanto, no pueden realizar ninguna operación)

Aunque la serialización resuelve los fenómenos de lectura de lecturas sucias, lecturas no repetibles y lecturas fantasmas. Pero las transacciones serializadas tendrán los siguientes efectos:

1. No se pueden leer registros que han sido modificados pero no confirmados por otras transacciones.

2. Antes de que se complete la transacción actual, otras transacciones no pueden modificar los registros leídos por la transacción actual.

3. Antes de que se complete la transacción actual, el valor de la clave de índice del nuevo registro insertado por otras transacciones no puede estar en el rango de clave de índice leído por ninguna declaración de la transacción actual.

Los cuatro niveles de aislamiento de transacciones son cada vez más altos de forma aislada, pero al mismo tiempo son cada vez más bajos en concurrencia. La razón por la que existen varios niveles de aislamiento es para facilitar que los desarrolladores elijan el nivel de aislamiento más apropiado según las necesidades comerciales durante el proceso de desarrollo.
[Intermedio] Análisis en profundidad del nivel de aislamiento de transacciones

Supongo que te gusta

Origin blog.51cto.com/13626762/2545861
Recomendado
Clasificación