¿Cómo administrar las operaciones de escritura simultáneas? Comience rápidamente

Administrar el directorio de operaciones de escritura simultáneas:

  • Instrucciones de aislamiento de transacciones

  • Operaciones de escritura y lectura y escritura

  • Posible situación de interbloqueo para transacciones de escritura simultáneas

  • Instancia de escritura simultánea

1. Descripción del aislamiento de transacciones

openGauss realiza una gestión de transacciones basada en MVCC (control de concurrencia de múltiples versiones) combinado con bloqueos de dos fases, que se caracteriza por no bloquear entre lectura y escritura. SELECCIONAR es una operación de lectura pura, ACTUALIZAR y ELIMINAR son operaciones de lectura y escritura.

  • No hay conflicto entre las operaciones de lectura y escritura y las operaciones de lectura pura, y no hay conflicto entre las operaciones de lectura y escritura. Cada transacción simultánea crea una instantánea de la transacción al comienzo de la transacción y las transacciones simultáneas no pueden detectar los cambios de las demás.

    • En el nivel de aislamiento de lectura confirmada, si se confirma la transacción T1, la transacción T2 puede ver el resultado de los cambios de la transacción T1.
    • En el nivel de lectura repetible, si la transacción T2 comienza a ejecutarse antes de que la transacción T1 confirme la transacción, después de que la transacción T1 se confirme, la transacción T2 aún no puede ver el resultado del cambio de la transacción T1, lo que garantiza que después de que comience una transacción, el resultado del la consulta es consistente y no afecta efectos de otros asuntos.
  • Las operaciones de lectura y escritura admiten bloqueos de nivel de fila. Diferentes transacciones pueden actualizar la misma tabla simultáneamente. Solo cuando se actualiza la misma fila, deben esperar. La transacción que ocurre más tarde esperará a que la transacción que ocurrió antes se confirme antes de ejecutar la operación de actualización.

    • LECTURA COMPROMETIDA: lectura del nivel de aislamiento confirmado, las transacciones solo pueden leer datos confirmados pero no datos no confirmados, que es el valor predeterminado.
    • LECTURA REPETIBLE: la transacción solo puede leer los datos que se han confirmado antes de que comience la transacción, y no puede leer los datos no confirmados y las modificaciones confirmadas por otras transacciones concurrentes durante la ejecución de la transacción.

2. Operaciones de escritura y lectura y escritura

Comandos para operaciones de escritura y lectura y escritura:

  • INSERT, que inserta una o más filas de datos en una tabla.
  • ACTUALIZAR, para modificar datos existentes en la tabla.
  • DELETE, para eliminar los datos existentes en la tabla.
  • COPIAR, importar datos.

INSERT y COPY son operaciones de escritura pura. Las operaciones de escritura simultáneas requieren esperar. Para operaciones en la misma tabla, cuando INSERTAR o COPIAR de la transacción T1 no está desbloqueado, INSERTAR o COPIAR de la transacción T2 debe esperar. Cuando la transacción T1 está desbloqueada, la transacción T2 continúa normalmente.

UPDATE y DELETE son operaciones de lectura y escritura (primero se consulta la fila que se va a operar). ACTUALIZAR y ELIMINAR necesitan consultar los datos antes de ejecutarse. Dado que las transacciones simultáneas son invisibles entre sí, las operaciones ACTUALIZAR y ELIMINAR son instantáneas de los datos enviados antes de que se produzca la transacción de lectura. La operación de escritura es un bloqueo de nivel de fila. Cuando la transacción T1 y la transacción T2 actualizan la misma fila al mismo tiempo, la transacción T2 posterior esperará. De acuerdo con el tiempo de espera establecido, si la transacción T1 no se envía por tiempo de espera, la transacción T2 no puede ejecutar; cuando la transacción T1 Las transacciones T1 y 2 se ejecutarán con éxito cuando las filas actualizadas simultáneamente por la transacción T2 sean diferentes.

3. Posible situación de punto muerto de transacciones de escritura simultáneas

Cada vez que una transacción implica actualizaciones en varias tablas o en la misma fila de la misma tabla, las transacciones que se ejecutan simultáneamente pueden bloquearse cuando se intenta escribir al mismo tiempo. Una transacción libera todos sus bloqueos a la vez al confirmar o retroceder, en lugar de renunciar a los bloqueos uno por uno. Por ejemplo, suponga que las transacciones T1 y T2 comienzan aproximadamente al mismo tiempo:

  • Si T1 comienza a escribir en la tabla A y T2 comienza a escribir en la tabla B, ambas transacciones pueden continuar sin conflicto; sin embargo, si T1 termina de escribir en la tabla A y necesita comenzar a escribir en la tabla Cuando B escribe, el número de filas en la operación es exactamente igual que el de T2, y no podrá continuar, porque T2 aún mantiene el bloqueo en la fila correspondiente de la tabla B. En este momento, T2 comienza a actualizar la misma cantidad de filas en la tabla A que T1. En este momento, tampoco podrá continuar, lo que provocará un interbloqueo. Dentro del tiempo de espera de bloqueo, la transacción anterior se compromete a liberar el bloqueo y la transacción posterior puede continuar realizando la actualización. Después de que expire el tiempo de espera, la transacción arroja un error y sale una transacción.
  • Si tanto T1 como T2 escriben en la tabla A, en este momento, T1 actualiza los datos en las filas 1 a 5 y T2 actualiza los datos en las filas 6 a 10, y las dos transacciones no entrarán en conflicto. Sin embargo, si T1 comienza a escribir a la tabla A después de completarse, se actualizan de 6 a 10 filas de datos. Después de completar T2, se actualizarán los datos de 1 a 5 filas. En este momento, las dos transacciones no pueden continuar. Dentro del tiempo de espera de bloqueo, la transacción anterior se compromete para liberar el bloqueo, y la última transacción puede continuar realizando la actualización, esperando Después de que expire el tiempo, la transacción arroja un error y sale una transacción.

Cuarto, el ejemplo de la escritura concurrente

  • INSERT y DELETE concurrencia de la misma tabla

  • INSERTs simultáneos de la misma tabla

  • ACTUALIZACIÓN simultánea de la misma tabla

  • Simultaneidad de importación y consulta de datos

Este capítulo toma la prueba de tabla como ejemplo para presentar la concurrencia de INSERT y DELETE de la misma tabla, la INSERCIÓN simultánea de la misma tabla, la ACTUALIZACIÓN simultánea de la misma tabla y los detalles de ejecución simultánea de importación y consulta de datos. 

CREATE TABLE test(id int, name char(50), address varchar(255));

① INSERT y DELETE de la misma tabla son concurrentes

Transacción T1:

START TRANSACTION;
INSERT INTO test VALUES(1,'test1','test123');
COMMIT;

Transacción T2:

START TRANSACTION;
DELETE test WHERE NAME='test1';
COMMIT;

escena 1:

Abra la transacción T1 y abra la transacción T2 sin confirmar. Después de que la transacción T1 ejecute INSERTAR, ejecute ELIMINAR de la transacción T2. ​​En este momento, se muestra ELIMINAR 0. Dado que la transacción T1 no se ha confirmado, la transacción 2 no puede ver los datos insertados por la transacción;

Escenario 2:

  • Nivel de LECTURA COMPROMETIDA

    Abra la transacción T1 y abra la transacción T2 sin confirmar. Después de que la transacción T1 ejecute INSERT, confirme la transacción T1. Cuando la transacción T2 ejecute la declaración DELETE nuevamente, se mostrará DELETE 1. Después de que la transacción T1 esté confirmada, la transacción T2 podrá ver esta entrada. Los datos pueden eliminarse con éxito.

  • Nivel de LECTURA REPETIBLE

    Abra la transacción T1 y abra la transacción T2 sin confirmar. Después de que la transacción T1 ejecute INSERTAR, confirme la transacción T1. Cuando la transacción T2 ejecute la instrucción DELETE nuevamente, se mostrará DELETE 0. Después de que se confirme la transacción T1, la transacción T2 aún no puede ver la transacción. Para los datos de T1, los datos consultados antes y después de una transacción son consistentes.

②INSERT concurrente de la misma tabla

Transacción T1:

START TRANSACTION;
INSERT INTO test VALUES(2,'test2','test123');
COMMIT;

Transacción T2:

START TRANSACTION;
INSERT INTO test VALUES(3,'test3','test123');
COMMIT;

escena 1:

Abra la transacción T1 y abra la transacción T2 sin confirmar. Después de que la transacción T1 ejecute INSERTAR, ejecute la instrucción INSERTAR de la transacción T2, que se puede ejecutar con éxito. Bajo los niveles de aislamiento de lectura confirmada y lectura repetible, la instrucción SELECT se ejecuta en la transacción T1. , los datos insertados en la transacción T2 no se pueden ver y la declaración de consulta ejecutada en la transacción T2 no puede ver los datos insertados en la transacción T1.

Escenario 2:

  • Nivel de LECTURA COMPROMETIDA

    Abra la transacción T1, abra la transacción T2 sin confirmar y confirme directamente después de ejecutar INSERT en la transacción T1. Después de ejecutar la instrucción INSERT en la transacción T2, ejecute la instrucción de consulta y podrá ver los datos insertados en la transacción T1.

  • Nivel de LECTURA REPETIBLE

    Abra la transacción T1, abra la transacción T2 sin confirmar y confirme directamente después de ejecutar INSERT en la transacción T1. Después de ejecutar la instrucción INSERT en la transacción T2, ejecute la instrucción de consulta y no podrá ver los datos insertados en la transacción T1.

③ ACTUALIZACIÓN simultánea de la misma tabla

Transacción T1:

START TRANSACTION;
UPDATE test SET address='test1234' WHERE name='test1';
COMMIT;

Transacción T2:

START TRANSACTION;
UPDATE test SET address='test1234' WHERE name='test2';
COMMIT;

Transacción T3:

START TRANSACTION;
UPDATE test SET address='test1234' WHERE name='test1';
COMMIT;

escena 1:

Abra la transacción T1, abra la transacción T2 sin confirmar, la transacción T1 comienza a ejecutar ACTUALIZAR, la transacción T2 comienza a ejecutar ACTUALIZAR y tanto la transacción T1 como la transacción T2 se ejecutan con éxito. Al actualizar diferentes filas, la operación de actualización toma bloqueos a nivel de fila, no se produce ningún conflicto y ambas transacciones se pueden ejecutar correctamente.

Escenario 2:

Abra la transacción T1, abra la transacción T3 sin confirmar, la transacción T1 comienza a ejecutar ACTUALIZAR, la transacción T3 comienza a ejecutar ACTUALIZAR, la transacción T1 se ejecuta correctamente y la transacción T3 espera un error después del tiempo de espera. Al actualizar la misma fila, cuando la transacción T1 no se confirma, el bloqueo no se libera, lo que da como resultado una ejecución fallida de la transacción T3.

④ Simultaneidad de importación y consulta de datos

Transacción T1:

START TRANSACTION;
COPY test FROM '...';
COMMIT;

Transacción T2:

START TRANSACTION;
SELECT * FROM test;
COMMIT;

escena 1:

Abra la transacción T1, abra la transacción T2 sin confirmar, la transacción T1 comienza a ejecutar COPY, la transacción T2 comienza a ejecutar SELECT y tanto la transacción T1 como la transacción T2 se ejecutan con éxito. La consulta en la transacción T2 no puede ver los datos entrantes de la nueva COPIA de la transacción T1.

Escenario 2:

  • Nivel de LECTURA COMPROMETIDA

    Abra la transacción T1 y abra la transacción T2 sin confirmar. La transacción T1 comienza a ejecutar COPY y luego confirma. La transacción T2 consulta y puede ver los datos de COPY en la transacción T1.

  • Nivel de LECTURA REPETIBLE

    Abra la transacción T1 y abra la transacción T2 sin confirmar. La transacción T1 comienza a ejecutar COPY y luego confirma. La transacción T2 consulta, pero los datos de COPY en la transacción T1 no se pueden ver.

{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/gaussdb/blog/5495325
Recomendado
Clasificación