Omówienie wielowersjnej kontroli współbieżności (MVCC) i migawek

Ukończone

Większość systemów zarządzania bazami danych (DBMS) używa blokad w celu wymuszania kontroli współbieżności, ale postgreSQL uzupełnia blokowanie przy użyciu alternatywnego podejścia. Usługa PostgreSQL używa systemu o nazwie Multi-Version Concurrency Control (MVCC), który umożliwia istnienie wielu wersji tego samego wiersza w celu poprawy współbieżności. W przypadku tego systemu każde zapytanie widzi poprzednią migawkę danych, które są spójne transakcyjnie. MVCC zapewnia, że transakcja odczytująca dane nie blokuje transakcji zapisującej dane i na odwrót.

Na przykład połączenie A wykonuje zapytanie, które skanuje wszystkie wiersze tabeli. Jednocześnie połączenie B wykonuje zapytanie, które aktualizuje niektóre wiersze. Aplikacja MVCC umożliwia jednoczesne uruchamianie obu zapytań przez utworzenie innej wersji wierszy, których dotyczy problem. W ten sposób połączenie B może wykonywać aktualizacje bez wpływu na połączenie A. Ten proces jest osiągany przez każdą wersję wiersza o wartości xmin widocznej dla , ponieważ transakcja i wartość xmax xmax dla widoczne do transakcji. W przypadku wzorca MVCC połączenie A zignoruje wszelkie modyfikacje, które wystąpiły po uruchomieniu zapytania Connection A.

diagram kontroli współbieżności w wielu wersjach przedstawiający zapytanie odczytu odczytujące oryginalne dane i zapytanie zapisu aktualizujące migawkę.

Transakcji

Transakcje w systemie DBMS są jednostką niepodzielnej pracy, dlatego transakcja zatwierdza się w całości lub w ogóle nie. Transakcje są również używane do zarządzania współbieżnością. W przypadku poziomów izolacji można zdefiniować efekt, jaki może mieć jedna transakcja na innych, współbieżnych transakcjach.

Rozpoczynasz transakcję za pomocą BEGIN TRANSACTION lub START TRANSACTION. Transakcję można zakończyć za pomocą polecenia COMMIT, aby zapisać wszystkie zmiany wprowadzone w transakcji, albo ROLLBACK, aby cofnąć wszelkie zmiany dokonane przez transakcję. Na przykład:

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