Definiowanie zakresu transakcji IndexedDB

Czym jest IndexedDB?

IndexedDB to rozwijający się standard internetowy służący do przechowywania znacznych ilości uporządkowanych danych w przeglądarce oraz do wydajnego wyszukiwania tych danych za pomocą indeksów. Inaczej mówiąc, IndexedDB jest obiektowym magazynem danych. Nie jest to to samo co baza danych relacyjna, która zawiera tabele z wierszami i kolumnami kolekcji. Jest to ważna i fundamentalna różnica, która wpływa na sposób projektowania i tworzenia aplikacji (więcej informacji znajdziesz w koncepcjach podstawowych).

Co się zmieniło?

Zmiany, przyjaciele... wprowadziliśmy pewne zmiany, które będą powodować błędy, jeśli nie potraktujemy ich jako prostej zmiany składni.

Od wersji 17 Chrome będzie zwracać błąd, jeśli transakcja IndexedDB nie jest ograniczona do magazynu obiektów. Ponieważ wszystkie operacje odczytu i zapisu danych są wykonywane w ramach transakcji, musimy utworzyć transakcję w bazie danych, określić zakres (np. które repozytoria obiektów mają mieć dostęp) i określić rodzaj dostępu (tylko do odczytu czy do zapisu).

Co to oznacza w kodzie? Zamiast przekazywać pustą tablicę do naszej bazy danych, użyj funkcji:

var transaction = db.transaction([], IDBTransaction.READ_ONLY);

Należy określić zakres na potrzeby konkretnego magazynu obiektów lub listy magazynów obiektów:

// all stores (equivalent to what use to be marked as empty array. )
var transaction = db.transaction(db.objectStoreNames, IDBTransaction.READ_ONLY);

// multiple stores:
var transaction = db.transaction(['ObjectStoreName1', 'ObjectStoreName2'],
    IDBTransaction.READ_ONLY);

// single store - these are equivalent
var transaction = db.transaction(['ObjectStoreName'], IDBTransaction.READ_ONLY);
var transaction = db.transaction('ObjectStoreName', IDBTransaction.READ_ONLY);

Możesz przyspieszyć dostęp do danych, używając odpowiedniego zakresu i reżimu w transakcji. Oto kilka wskazówek: Podczas definiowania zakresu podaj tylko te obiekty, których potrzebujesz. Dzięki temu możesz jednocześnie wykonywać wiele transakcji z nienakładającymi się zakresami. Tylko w razie potrzeby określ tryb transakcji READ_WRITE. Możesz jednocześnie uruchamiać wiele transakcji READ_ONLY o nakładających się zakresach, ale w przypadku repozytorium obiektów może być tylko 1 transakcja READ_WRITE.

Inne źródła:

Do zobaczenia...