Inzicht in gelijktijdigheidsbeheer met meerdere versies (MVCC) en momentopnamen

Voltooid

De meeste databasebeheersystemen (DBMS) gebruiken vergrendelingen om gelijktijdigheidsbeheer af te dwingen, maar PostgreSQL is een aanvulling op het vergrendelen met een alternatieve benadering. PostgreSQL maakt gebruik van een systeem met de naam Multi-Version Concurrency Control (MVCC) waarmee meerdere versies van dezelfde rij kunnen bestaan om de gelijktijdigheid te verbeteren. Met dit systeem ziet elke query een eerdere momentopname van de gegevens die transactioneel consistent zijn. MVCC zorgt ervoor dat een transactie die gegevens leest, geen transactie blokkeert die gegevens schrijft en omgekeerd.

Verbinding maken ion A voert bijvoorbeeld een query uit waarmee alle rijen van een tabel worden gescand. Tegelijkertijd voert Verbinding maken ion B een query uit waarmee sommige rijen worden bijgewerkt. MET MVCC kunnen beide query's tegelijkertijd worden uitgevoerd door een andere versie van de betrokken rijen te maken. Op deze manier kan Verbinding maken ion B de updates uitvoeren zonder dat dit van invloed is op Verbinding maken ion A. Dit proces wordt bereikt door elke rijversie met een xmin-waarde voor de zichtbare sinds transactie en een xmax-waarde voor de zichtbare tot de transactie. Met MVCC negeert Verbinding maken ion A alle wijzigingen die zijn aangebracht nadat de Verbinding maken ion A-query is gestart.

Diagram van gelijktijdigheidsbeheer met meerdere versies met een leesquery die de oorspronkelijke gegevens leest en een schrijfquery die een momentopname bijwerkt.

Transacties

Transacties in een DBMS zijn een atomische werkeenheid, waardoor de transactie in zijn geheel of helemaal niet doorvoert. Transacties worden ook gebruikt voor gelijktijdigheidsdoeleinden. Met isolatieniveaus kan het effect dat één transactie kan hebben op andere, gelijktijdige transacties, worden gedefinieerd.

U start een transactie met een BEGIN TRANSACTION of START TRANSACTION. U voltooit een transactie met COMMIT om alle wijzigingen in de transactie op te slaan, of TERUGDRAAIEN, om wijzigingen die door de transactie zijn aangebracht ongedaan te maken. Voorbeeld:

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