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 transakcję odczytującą dane nie blokuje transakcji, która zapisuje dane i na odwrót.

Na przykład Połączenie ion A wykonuje zapytanie, które skanuje wszystkie wiersze tabeli. Jednocześnie Połączenie ion 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 usługa Połączenie ion B może wykonywać aktualizacje bez wpływu na Połączenie ion A. Ten proces jest osiągany przez każdą wersję wiersza o wartości xmin widocznej od transakcji i wartość xmax dla widocznej do transakcji. W przypadku wzorca MVCC Połączenie ion A zignoruje wszelkie modyfikacje, które wystąpiły po uruchomieniu zapytania Połączenie ion.

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

Transakcje

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 celów 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.

Transakcja rozpoczyna się od transakcji BEGIN TRANSACTION lub START TRANSACTION. Transakcja zostanie zakończona za pomocą polecenia COMMIT, aby zapisać wszystkie zmiany wprowadzone w transakcji lub wycofać, aby cofnąć wszelkie zmiany wprowadzone przez transakcję. Na przykład:

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