Idb-keyval — это легковесная обертка над IndexedDB, обеспечивающая удобный интерфейс для работы с ключами и значениями. Несмотря на простоту API, каждая операция внутри Idb-keyval выполняется с использованием транзакций IndexedDB. Понимание принципов транзакций позволяет более эффективно использовать библиотеку и правильно обрабатывать асинхронные операции.
Транзакция в контексте IndexedDB — это последовательность операций,
которые выполняются атомарно. Атомарность гарантирует, что либо все
изменения внутри транзакции применяются, либо ни одно не применяется при
возникновении ошибки. В Idb-keyval каждая функция (get,
set, del, clear,
keys) оборачивает свою логику в транзакцию автоматически,
что избавляет от необходимости создавать транзакции вручную для простых
операций.
Idb-keyval использует два основных типа транзакций:
readonly — транзакция только для чтения.
Используется при вызове get и keys.
readwrite — транзакция для чтения и записи.
Используется при вызовах set, del и
clear.
import { get, set } from 'idb-keyval';
// Пример использования readwrite транзакции внутри set
await set('username', 'Alice'); // автоматически создается readwrite транзакция
Транзакции Idb-keyval ведут себя согласно спецификации IndexedDB:
.catch или конструкцию
try/catch с async/await.Пример обработки ошибок:
import { set } from 'idb-keyval';
try {
await set('settings', { theme: 'dark' });
} catch (error) {
console.error('Ошибка записи в IndexedDB:', error);
}
Важно понимать, что транзакция охватывает только одну функцию. Если нужно выполнить несколько операций атомарно, стандартный Idb-keyval не предоставляет встроенного метода для объединения операций в одну транзакцию. Для этого потребуется работать напрямую с IndexedDB API.
Все операции Idb-keyval возвращают промисы, так как транзакции IndexedDB асинхронные. Это обеспечивает:
await.Пример последовательного выполнения:
import { set, get } from 'idb-keyval';
await set('theme', 'light'); // завершение write транзакции
const theme = await get('theme'); // новая readonly транзакция
console.log(theme); // 'light'
Даже если транзакции создаются автоматически, важно помнить, что
каждая операция запускает отдельную транзакцию. Это означает, что между
двумя вызовами set могут сработать другие операции
IndexedDB в браузере.
Idb-keyval предоставляет функции clear и
keys для работы с большим количеством данных.
clear запускает readwrite транзакцию и
удаляет все пары ключ-значение.keys использует readonly транзакцию
для перебора всех ключей.Для больших наборов данных транзакции могут быть длительными. В таких случаях важно учитывать:
readonly используется для чтения,
readwrite — для записи и удаления.Эти принципы позволяют использовать Idb-keyval безопасно и эффективно, понимая, как транзакции влияют на атомарность, консистентность и производительность операций.