Descripción del control de simultaneidad de varias versiones (MVCC) y de las instantáneas

Completado

La mayoría de los sistemas de administración de bases de datos (DBMS) usan bloqueos para aplicar el control de simultaneidad, pero PostgreSQL complementa el bloqueo con un enfoque alternativo. PostgreSQL usa un sistema denominado control de simultaneidad de varias versiones (MVCC) que permite que existan varias versiones de la misma fila para mejorar la simultaneidad. Con este sistema, cada consulta ve una instantánea anterior de los datos que es transaccionalmente coherente. MVCC garantiza que una transacción que lee datos no bloquea una transacción que escribe datos y viceversa.

Por ejemplo, la conexión A está realizando una consulta que examina todas las filas de una tabla. Al mismo tiempo, la conexión B está realizando una consulta que actualiza algunas de las filas. MVCC permite que ambas consultas se ejecuten al mismo tiempo, ya que crea otra versión de las filas afectadas. De este modo, la conexión B puede realizar las actualizaciones sin que esto afecte a la conexión A. Para lograr este proceso, cada versión de fila tiene un valor xmin para la transacción visible since y un valor xmax para la transacción visible until. Con MVCC, la conexión A omitirá las modificaciones que se produjeron después de iniciar la consulta Conexión A.

Diagrama de control de simultaneidad de varias versiones en el que se muestra una consulta de lectura que lee los datos originales y una consulta de escritura que actualiza una instantánea.

Transacciones

Las transacciones de un DBMS son una unidad atómica de trabajo, por lo que la transacción o se confirma en su totalidad o no se confirma. Las transacciones también se usan con fines de simultaneidad. Con los niveles de aislamiento, se puede definir el efecto que una transacción puede tener en otras transacciones simultáneas.

Para iniciar una transacción, se usa BEGIN TRANSACTION o START TRANSACTION. Para completar una transacción, se usa COMMIT para guardar todos los cambios realizados en la transacción o ROLLBACK para deshacer los cambios que realice la transacción. Por ejemplo:

BEGIN TRANSACTION;
    UPDATE production.workorder
        SET stockedqty=7
        WHERE workorderid=1;
COMMIT;