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.

Verbindings A voert bijvoorbeeld een query uit waarmee alle rijen van een tabel worden gescand. Tegelijkertijd voert Connection 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 B de updates uitvoeren zonder dat dit van invloed is op Verbinding A. Dit proces wordt bereikt door elke rijversie met een xmin- waarde voor de zichtbaar sinds transactie en een xmax- waarde voor de zichtbaar tot transactie. Met MVCC negeert Connection A alle wijzigingen die zijn opgetreden nadat de verbindingsquery A is gestart.

diagram van gelijktijdigheidsbeheerdiagram 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 atomaire werkeenheid, waardoor de transactie in zijn geheel of helemaal niet wordt doorgevoerd. Transacties worden ook gebruikt voor gelijktijdigheidsdoeleinden. Met isolatieniveaus kan het effect dat één transactie kan hebben op andere, gelijktijdige transacties, worden gedefinieerd.

Start een transactie met 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. Bijvoorbeeld:

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