Twórcy projektu SQLite rozpoczęli testowanie eksperymentalnego backendu HCtree, który wspiera blokady na poziomie wierszy i zapewnia wysoki poziom równoległego przetwarzania zapytań. Nowy backend ma na celu zwiększenie efektywności wykorzystania SQLite w systemach kliencko-serwerowych, które muszą obsługiwać dużą liczbę równoczesnych zapisów do bazy danych.
Struktury b-drzew, które pierwotnie były wykorzystywane w SQLite do przechowywania danych, nie są przystosowane do tego typu obciążenia, co ogranicza SQLite do zapisu tylko w jednym wątku. W ramach eksperymentu, twórcy zaczęli rozwijać alternatywne rozwiązanie, które stosuje strukturę HC-tree, bardziej odpowiednią do równoległego przetwarzania operacji zapisu.
Aby zorganizować równoczesne wykonywanie wielu operacji w HCtree, została zastosowana mechanizm podziału transakcji, wykorzystujący blokady na poziomie stron, podobny do MVCC (wielowersyjnego zarządzania dostępem współbieżnym), jednak oparty na weryfikacjach transakcji w oparciu o klucze i zakresy kluczy, a nie zestawy stron. Operacje odczytu i zapisu są związane z migawką bazy danych, a ich zmiany stają się widoczne w głównej bazie danych dopiero po zakończeniu transakcji.
Klienci mogą korzystać z trzech operacji otwierania transakcji:
- „BEGIN” — transakcje nie uwzględniają danych o dostępie innych klientów. W przypadku wykonywania operacji zapisu w transakcji, transakcja może zostać zatwierdzona tylko wtedy, gdy w czasie jej trwania nie było innych operacji zapisu w bazie danych.
- „BEGIN CONCURRENT” — transakcje zbierają informacje o dostępie innych klientów. W przypadku wykonywania operacji zapisu w transakcji, transakcja może zostać zatwierdzona, jeśli od momentu utworzenia migawki w bazie danych zostały zatwierdzone inne transakcje.
- „BEGIN EXCLUSIVE” — po otwarciu transakcji blokuje operacje z innych transakcji do czasu jej zakończenia.
HCtree obsługuje replikację w stylu „master-slave”, co pozwala na przenoszenie transakcji do innej bazy danych oraz utrzymywanie wtórnych baz danych w stanie zsynchronizowanym z bazą główną. HCtree również znosi ograniczenie dotyczące rozmiaru bazy danych — zamiast 32-bitowych identyfikatorów stron danych, w HCtree stosowane są 48-bitowe, co zwiększa maksymalny rozmiar bazy danych z 16 tebibajtów do 1 eksbibajta (milion tebibajtów). Oczekuje się, że wydajność SQLite z backendem HCtree nie będzie gorsza niż klasycznego jednoprądowego backendu. Klienci SQLite z obsługą HCtree będą mogli uzyskiwać dostęp zarówno do baz danych opartych na strukturze HC-tree, jak i do starych baz danych SQLite.
Źródło: opennet.ru
