Entender o MVCC (Controle de Simultaneidade de Várias Versões) e os instantâneos

Concluído

A maioria dos DBMS (sistemas de gerenciamento de banco de dados) usa bloqueios para impor o controle de simultaneidade, mas o PostgreSQL complementa o bloqueio com uma abordagem alternativa. O PostgreSQL usa um sistema chamado MVCC (Controle de Simultaneidade de Várias Versões) que permite que existam várias versões da mesma linha para aprimorar a simultaneidade. Com esse sistema, cada consulta vê um instantâneo anterior dos dados que é transacionalmente consistente. O MVCC garante que uma transação que está lendo dados não bloqueará uma transação que está gravando dados e vice-versa.

Por exemplo, a Conexão A está executando uma consulta que verifica todas as linhas de uma tabela. Ao mesmo tempo, a Conexão B está executando uma consulta que atualiza algumas das linhas. Criando outra versão das linhas afetadas, o MVCC permite que ambas as consultas sejam executadas ao mesmo tempo. Dessa forma, a Conexão B pode executar as atualizações sem afetar a Conexão A. Esse processo é alcançado fazendo-se com que cada versão da linha tenha um valor xmin para a transação visível desde e um valor xmax para a transação visível até. Com o MVCC, a Conexão A vai ignorar todas as modificações ocorridas após o início da consulta da Conexão A.

Diagrama do Controle de Simultaneidade de Várias Versões mostrando uma consulta de leitura que lê os dados originais e uma consulta de gravação que atualiza um instantâneo.

Transactions

As transações em um DBMS são uma unidade atômica de trabalho, portanto, a transação é confirmada em sua totalidade ou não é confirmada em absoluto. As transações também são usadas para fins de simultaneidade. Com os níveis de isolamento, o efeito que uma transação pode ter em outras transações simultâneas pode ser definido.

Você inicia uma transação com uma BEGIN TRANSACTION ou START TRANSACTION. Você conclui uma transação com COMMIT, para salvar todas as alterações feitas na transação ou ROLLBACK, para desfazer quaisquer alterações feitas pela transação. Por exemplo:

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