MVCC

MVCC to skrót od Multiversion Concurrency Control, czyli tłumacząc swobodnie na język polski – oparte o wersje zarządzanie współbieżnością. A mówiąc prościej, jest to sposób na to jak za pomocą wersji (przypisywanych do rekordów) zarządzać dostępem do/modyfikacją danych. MVCC rozwiązuje problem dostępu do zasobów, który pojawia się przy zastosowaniu blokad. Warto też wspomnieć, że zastosowanie MVCC może powodować pojawienie się różnych anomalii, z którymi można sobie poradzić dobierając odpowiedni poziom izolacji (z tym, że im wyższy poziom izolacji tym wolniej będzie działał system).

Jak to działa?

Każdy silnik baz danych robi to trochę inaczej, ale idea stojąca za MVCC jest taka sama – odczyt nie powoduje blokowania aktualizacji i aktualizacje nie blokują odczytu. A to wszystko dzięki wprowadzeniu wersji rekordów w bazie danych. Wersje te są zarządzane wewnętrznie przez silniki baz danych.

Gdy transakcja dokonuje aktualizacji (update) rekordu, to tak naprawdę zamiast zamiany danych w rekordzie, tworzona jest następna wersja rekordu, co pozwala na nieblokowanie się wzajemne transakcji.

Przykład

Załóżmy, że mamy następujący stan w tabeli Users:


I teraz użytkownik John otwiera transakcję odczytującą imię i nazwisko użytkownika o id 1:

SELECT name, surname FROM Users WHERE id = 1;


Dosłownie ułamek później użytkownik Mike dowiaduje się, że użytkownik z id równym 1 skończył już 35 lat, więc otwiera transakcję w celu zaktualizowania wartości i dokonuje zmian:

UPDATE Users SET age = 35 WHERE id = 1;


Aktualizacja zmian odbywa się natychmiastowo – nie jest konieczne oczekiwanie na zakończenie transakcji Johna. A rezultatem aktualizacji jest dodanie kolejnego wpisu z kolejną wersją:


Każdy następny odczyt rekordu o id = 1 (jak i każdego innego) spowoduje zaciągnięcie rekordu z najnowszą wersją.

Jak włączyć?

Niektóre bazy danych wspierają domyślnie MVCC, lecz w niektórych należy jawnie przełączyć się na MVCC. Na przykład dla bazy danych Oracle:

Co ze starymi wersjami?

Podobnie jak w języku programowania Java, istnieją odśmiecacze pamięci (garbage collector). Są to wątki, które to co jakiś czas sprawdzają co już można usunąć i się tego pozbywają.

Zarządzanie wersjami

Przykład z sekcji Jak to działa jest pewnego rodzaju uproszczeniem jak działa wersjonowanie. Silniki baz danych przechowują wersje na różne sposoby:

SilnikMiejsce przechowywania wersji
PostgreSQLtablespace – to samo miejsce co dane tabel (istnieją systemowe kolumny, które wskazują na wersje)
Oracleprzestrzeń UNDO
MSSQLtempdb