IDBTransaction
Базовая Широко доступная *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с сентября 2021 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Примечание: Эта функция доступна в Потоках веб-работы.
Интерфейс IDBTransaction API IndexedDB предоставляет статический асинхронный транзакцию с базой данных, используя атрибуты обработчиков событий. Все чтение и запись данных выполняется в рамках транзакций. Вы используете IDBDatabase для запуска транзакций, IDBTransaction для задания режима транзакции (например, это readonly или readwrite), и вы получаете доступ к IDBObjectStore для выполнения запроса. Также вы можете использовать объект IDBTransaction для прерывания транзакций.
Транзакции запускаются при создании транзакции, а не при выполнении первого запроса; например, рассмотрите это:
const trans1 = db.transaction("foo", "readwrite");
const trans2 = db.transaction("foo", "readwrite");
const objectStore2 = trans2.objectStore("foo");
const objectStore1 = trans1.objectStore("foo");
objectStore2.put("2", "key");
objectStore1.put("1", "key");
После выполнения кода хранилище объектов должно содержать значение "2", поскольку trans2 должно выполняться после trans1.
Транзакция чередует состояния активный и неактивный между задачами цикла событий. Она активна в задаче при создании и в каждой задаче обработчиков событий success или error запросов. Она неактивна во всех других задачах, в этом случае размещение запросов завершится неудачей. Если новые запросы не выполняются, когда транзакция активна, и нет других незавершенных запросов, транзакция автоматически подтверждается.
Ошибки транзакций
Транзакции могут завершиться неудачей по нескольким причинам, все из которых (за исключением сбоя пользовательского агента) приведут к вызову обратного вызова прерывания:
- Прерывание из-за некорректных запросов, например, попытка
add()одного и того же ключа дважды илиput()с тем же ключом индекса с ограничением уникальности. Это приводит к ошибке в запросе, которая может привести к ошибке в транзакции, которая прерывает транзакцию. Это можно предотвратить, используяpreventDefault()на событии об ошибке в запросе. - Явный вызов
abort()из скрипта. - Необработанное исключение в обработчике событий
success/errorзапроса. - Ошибка ввода-вывода (например, фактическая ошибка записи на диск или другие ошибки ОС/аппаратного обеспечения).
- Превышение квоты.
- Сбой пользовательского агента.
Гарантии живучести Firefox
Обратите внимание, что начиная с Firefox 40, транзакции IndexedDB имеют ослабленные гарантии живучести для повышения производительности (см. отчет об ошибке Firefox 1112702.) Раньше в транзакции readwrite событие complete срабатывало только тогда, когда все данные гарантированно были записаны на диск. В Firefox 40+ событие complete срабатывает после того, как ОС получила команду записать данные, но потенциально до того, как эти данные фактически будут записаны на диск. Таким образом, событие complete может быть доставлено быстрее, чем раньше, однако существует небольшой шанс, что вся транзакция будет потеряна, если ОС аварийно завершит работу или произойдет потеря электропитания до записи данных на диск. Поскольку такие катастрофические события редки, большинство потребителей не должны беспокоиться об этом дальше.
Если вы должны обеспечить живучесть по какой-либо причине (например, вы храните критические данные, которые нельзя повторно вычислить позже), вы можете принудительно записать транзакцию на диск перед доставкой события complete, создав транзакцию с экспериментальным (нестандартным) режимом readwriteflush (см. IDBDatabase.transaction.
Свойства экземпляра
-
IDBTransaction.dbТолько для чтения -
Подключение к базе данных, с которой связана эта транзакция.
-
IDBTransaction.durabilityТолько для чтения -
Возвращает подсказку о живучести, с которой была создана транзакция.
-
IDBTransaction.errorТолько для чтения -
Возвращает
DOMException, указывающий на тип ошибки, возникшей при неудачной транзакции. Это свойствоnull, если транзакция не завершена, завершена успешно или прервана с помощью функцииIDBTransaction.abort(). -
IDBTransaction.modeТолько для чтения -
Режим изоляции доступа к данным в хранилищах объектов, которые находятся в области действия транзакции. Значение по умолчанию —
readonly. -
IDBTransaction.objectStoreNamesТолько для чтения -
Возвращает
DOMStringListс именами объектовIDBObjectStore, связанных с транзакцией.
Методы экземпляра
Унаследовано от: EventTarget
IDBTransaction.abort()-
Откатывает все изменения в объектах базы данных, связанных с этой транзакцией. Если эта транзакция была прервана или завершена, этот метод вызывает событие об ошибке.
IDBTransaction.objectStore()-
Возвращает объект
IDBObjectStore, представляющий хранилище объектов, которое входит в область действия этой транзакции. IDBTransaction.commit()-
Для активной транзакции подтверждает транзакцию. Обратите внимание, что это обычно не нужно вызывать — транзакция автоматически подтверждается, когда все ожидающие запросы удовлетворены и новые запросы не отправляются.
commit()можно использовать для запуска процесса подтверждения без ожидания событий от незавершенных запросов.
События
Присоединяйтесь к этим событиям с помощью addEventListener() или назначив обработчик события свойству oneventname этого интерфейса.
abort-
Событие, которое срабатывает, когда транзакция
IndexedDBпрерывается. Также доступно через свойствоonabort; это событие распространяется наIDBDatabase. complete-
Событие, которое срабатывает, когда транзакция успешно завершается. Также доступно через свойство
oncomplete. error-
Событие, которое срабатывает, когда запрос возвращает ошибку, и событие распространяется до объекта подключения (
IDBDatabase). Также доступно через свойствоonerror.
Константы режима
Устаревшая функция: Эта функция больше не рекомендуется. Хотя некоторые браузеры могут по-прежнему поддерживать её, она может быть удалена из соответствующих веб-стандартов, находится в процессе удаления или поддерживается только для совместимости. Избегайте её использования и, при возможности, обновите существующий код; см. таблицу совместимости внизу этой страницы для руководства по принятию решения. Имейте в виду, что эта функция может перестать работать в любое время.
Предупреждение: Эти константы больше недоступны — они были удалены в Gecko 25. Вместо этого вы должны использовать строковые константы напрямую. (отчет об ошибке Firefox 888598)
Транзакции могут иметь один из трёх режимов:
| Константа | Значение | Описание |
|---|---|---|
READ_ONLY | "readonly" (0 в Chrome) | Разрешает чтение данных, но не позволяет их изменять. |
READ_WRITE | "readwrite" (1 в Chrome) | Разрешает чтение и запись данных, позволяя изменять существующие хранилища данных. |
VERSION_CHANGE | "versionchange" (2 в Chrome) | Разрешает любые операции, включая удаление и создание хранилищ объектов и индексов. Транзакции в этом режиме не могут выполняться параллельно с другими транзакциями. Транзакции в этом режиме известны как "транзакции обновления". |
Даже если эти константы устарели, вы по-прежнему можете использовать их для обеспечения обратной совместимости, если это необходимо (в Chrome изменение было внесено в версии 21). Вы должны писать код с защитой на случай, если объект больше недоступен:
const myIDBTransaction = window.IDBTransaction ||
window.webkitIDBTransaction || { READ_WRITE: "readwrite" };
Примеры
В следующем фрагменте кода мы открываем транзакцию чтения/записи в нашей базе данных и добавляем некоторые данные в хранилище объектов. Обратите внимание также на функции, прикрепленные к обработчикам событий транзакций, для сообщения о результате открытия транзакции в случае успеха или неудачи. Для полного рабочего примера см. наше приложение To-do Notifications (смотреть пример в действии).
const note = document.getElementById("notifications");
// an instance of a db object for us to store the IDB data in
let db;
// Let us open our database
const DBOpenRequest = window.indexedDB.open("toDoList", 4);
DBOpenRequest.onsuccess = (event) => {
note.appendChild(document.createElement("li")).textContent =
"Database initialized.";
// store the result of opening the database in the db
// variable. This is used a lot below
db = DBOpenRequest.result;
// Add the data to the database
addData();
};
function addData() {
// Create a new object to insert into the IDB
const newItem = [
{
taskTitle: "Walk dog",
hours: 19,
minutes: 30,
day: 24,
month: "December",
year: 2013,
notified: "no",
},
];
// open a read/write db transaction, ready to add data
const transaction = db.transaction(["toDoList"], "readwrite");
// report on the success of opening the transaction
transaction.oncomplete = (event) => {
note.appendChild(document.createElement("li")).textContent =
"Transaction completed: database modification finished.";
};
transaction.onerror = (event) => {
note.appendChild(document.createElement("li")).textContent =
"Transaction not opened due to error. Duplicate items not allowed.";
};
// create an object store on the transaction
const objectStore = transaction.objectStore("toDoList");
// add our newItem object to the object store
const objectStoreRequest = objectStore.add(newItem[0]);
objectStoreRequest.onsuccess = (event) => {
// report the success of the request (this does not mean the item
// has been stored successfully in the DB - for that you need transaction.oncomplete)
note.appendChild(document.createElement("li")).textContent =
"Request successful.";
};
}
Спецификации
| Спецификация |
|---|
| Indexed Database API 3.0 # transaction |
Совместимость с браузерами
| Настольные | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
IDBTransaction |
2423–57 | 12 | 1610–16 | 15 | 8 | 2525–57 | 22 | 14 | 8 | 1.51.5–7.0 | 4.4≤37–57 |
abort |
23 | 12 | 10 | 15 | 8 | 25 | 22 | 14 | 8 | 1.5 | 4.4 |
abort_event |
23 | 12 | 10 | 15 | 8 | 25 | 22 | 14 | 8 | 1.5 | 4.4 |
commit |
76 | 79 | 74 | 63 | 15 | 76 | 79 | 54 | 15 | 12.0 | 76 |
complete_event |
23 | 12 | 10 | 15 | 8 | 25 | 22 | 14 | 8 | 1.5 | 4.4 |
db |
23 | 12 | 10 | 15 | 8 | 25 | 22 | 14 | 8 | 1.5 | 4.4 |
durability |
83 | 83 | 126 | 70 | 15 | 83 | 126 | 59 | 15 | 13.0 | 83 |
error |
23 | 12 | 10 | 15 | 8 | 25 | 22 | 14 | 8 | 1.5 | 4.4 |
error_event |
23 | 12 | 10 | 15 | 8 | 25 | 22 | 14 | 8 | 1.5 | 4.4 |
mode |
23 | 12 | 10 | 15 | 8 | 25 | 22 | 14 | 8 | 1.5 | 4.4 |
objectStore |
23 | 12 | 10 | 15 | 8 | 25 | 22 | 14 | 8 | 1.5 | 4.4 |
objectStoreNames |
48 | 79 | 10 | 35 | 10.1 | 48 | 22 | 35 | 10.3 | 5.0 | 48 |
worker_support |
23 | 12 | 37 | 15 | 10 | 25 | 37 | 14 | 10 | 1.5 | 4.4 |
См. также
- Использование IndexedDB
- Начало транзакций:
IDBDatabase - Установка диапазона ключей:
IDBKeyRange - Извлечение и внесение изменений в ваши данные:
IDBObjectStore - Использование курсоров:
IDBCursor - Пример для справки: To-do Notifications (Посмотреть пример в действии).
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction