IDBTransaction
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Das IDBTransaction
-Interface der IndexedDB API bietet eine statische, asynchrone Transaktion auf einer Datenbank unter Verwendung von Event-Handler-Attributen. Alle Lese- und Schreibvorgänge werden innerhalb von Transaktionen durchgeführt. Sie verwenden IDBDatabase
, um Transaktionen zu starten, IDBTransaction
, um den Modus der Transaktion festzulegen (z.B. ob sie readonly
oder readwrite
ist), und Sie greifen auf einen IDBObjectStore
zu, um eine Anfrage zu stellen. Sie können auch ein IDBTransaction
-Objekt verwenden, um Transaktionen abzubrechen.
Transaktionen starten, wenn die Transaktion erstellt wird, nicht bei der ersten Anforderung; betrachten Sie zum Beispiel dies:
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");
Nachdem der Code ausgeführt wurde, sollte der Object Store den Wert "2" enthalten, da trans2
nach trans1
ausgeführt werden sollte.
Eine Transaktion wechselt zwischen aktiv und inaktiv zwischen Event-Loop-Aufgaben. Sie ist aktiv in der Aufgabe, als sie erstellt wurde, und in jeder Aufgabe der success
- oder error
-Event-Handler der Anfragen. Sie ist in allen anderen Aufgaben inaktiv, in diesem Fall schlägt das Platzieren von Anfragen fehl. Wenn keine neuen Anfragen platziert werden, während die Transaktion aktiv ist, und keine anderen ausstehenden Anfragen vorhanden sind, wird die Transaktion automatisch abgeschlossen.
Transaktionsfehler
Transaktionen können aus einer festen Anzahl von Gründen fehlschlagen, die alle (außer dem Absturz des Benutzeragenten) einen Abbruch-Callback auslösen:
- Abbruch aufgrund schlechter Anfragen, z.B. der Versuch, denselben Schlüssel zweimal hinzuzufügen (
add()
), oder einput()
mit demselben Indexschlüssel mit einem Eindeutigkeitskriterium. Dies verursacht einen Fehler bei der Anfrage, der zu einem Fehler bei der Transaktion führen kann, der die Transaktion abbricht. Dies kann verhindert werden, indempreventDefault()
auf dem Fehlerereignis der Anfrage verwendet wird. - Ein expliziter
abort()
-Aufruf aus dem Skript. - Eine nicht abgefangene Ausnahme in der
success
/error
-Handler der Anfrage. - Ein I/O-Fehler (z.B. ein tatsächliches Scheitern, auf die Festplatte zu schreiben, oder ein anderer OS-/Hardwarefehler).
- Überschrittenes Kontingent.
- Ein Absturz des Benutzeragenten.
Dauerhaftigkeitsgarantien in Firefox
Beachten Sie, dass ab Firefox 40 IndexedDB-Transaktionen entspannte Dauerhaftigkeitsgarantien haben, um die Leistung zu steigern (siehe Firefox-Bug 1112702). Früher wurde in einer readwrite
-Transaktion ein complete
-Ereignis nur ausgelöst, wenn alle Daten garantiert auf die Festplatte geschrieben wurden. In Firefox 40+ wird das complete
-Ereignis ausgelöst, nachdem dem Betriebssystem mitgeteilt wurde, die Daten zu schreiben, möglicherweise jedoch bevor diese Daten tatsächlich auf die Festplatte geschrieben wurden. Das complete
-Ereignis kann daher schneller als zuvor zugestellt werden, jedoch besteht eine kleine Chance, dass die gesamte Transaktion verloren geht, wenn das Betriebssystem abstürzt oder ein Stromausfall auftritt, bevor die Daten auf die Festplatte geschrieben werden. Da solche katastrophalen Ereignisse selten sind, sollten sich die meisten Verbraucher nicht weiter darum kümmern müssen.
Wenn Sie aus irgendeinem Grund Dauerhaftigkeit sicherstellen müssen (z.B. speichern Sie kritische Daten, die später nicht neu berechnet werden können), können Sie eine Transaktion erzwingen, um auf die Festplatte zu schreiben, bevor das complete
-Ereignis erfolgt, indem Sie eine Transaktion mit dem experimentellen (nicht-standardisierten) readwriteflush
-Modus erstellen (siehe IDBDatabase.transaction
.
Instanz-Eigenschaften
IDBTransaction.db
Schreibgeschützt-
Die Datenbankverbindung, mit der diese Transaktion verbunden ist.
IDBTransaction.durability
Schreibgeschützt-
Gibt den Dauerhaftigkeitshinweis zurück, mit dem die Transaktion erstellt wurde.
IDBTransaction.error
Schreibgeschützt-
Gibt eine
DOMException
zurück, die den Typ des Fehlers angibt, der auftrat, wenn eine Transaktion nicht erfolgreich war. Diese Eigenschaft istnull
, wenn die Transaktion nicht abgeschlossen ist, erfolgreich abgeschlossen wurde oder mit der FunktionIDBTransaction.abort()
abgebrochen wurde. IDBTransaction.mode
Schreibgeschützt-
Der Modus zur Isolierung des Zugriffs auf Daten in den im Geltungsbereich der Transaktion enthaltenen Objekt-Stores. Der Standardwert ist
readonly
. IDBTransaction.objectStoreNames
Schreibgeschützt-
Gibt eine
DOMStringList
der Namen derIDBObjectStore
-Objekte zurück, die mit der Transaktion verbunden sind.
Instanz-Methoden
Erbt von: EventTarget
IDBTransaction.abort()
-
Macht alle Änderungen an Objekten in der mit dieser Transaktion verbundenen Datenbank rückgängig. Wenn diese Transaktion abgebrochen oder abgeschlossen wurde, löst diese Methode ein Fehlerereignis aus.
IDBTransaction.objectStore()
-
Gibt ein
IDBObjectStore
-Objekt zurück, das einen Objekt-Store darstellt, der Teil des Geltungsbereichs dieser Transaktion ist. IDBTransaction.commit()
-
Für eine aktive Transaktion wird die Transaktion abgeschlossen. Beachten Sie, dass dies normalerweise nicht aufgerufen werden muss — eine Transaktion wird automatisch abgeschlossen, wenn alle ausstehenden Anfragen zufriedenstellend bearbeitet wurden und keine neuen Anfragen gestellt werden.
commit()
kann verwendet werden, um den Abschlussprozess zu starten, ohne auf Ereignisse aus ausstehenden Anfragen zu warten.
Ereignisse
Hören Sie diese Ereignisse mit addEventListener()
ab oder indem Sie einen Ereignis-Listener der Eigenschaft oneventname
dieser Schnittstelle zuweisen.
abort
-
Ein Ereignis, das ausgelöst wird, wenn die
IndexedDB
-Transaktion abgebrochen wird. Auch über dieonabort
-Eigenschaft verfügbar; dieses Ereignis steigt bis zurIDBDatabase
hinauf. complete
-
Ein Ereignis, das ausgelöst wird, wenn die Transaktion erfolgreich abgeschlossen wurde. Auch über die
oncomplete
-Eigenschaft verfügbar. error
-
Ein Ereignis, das ausgelöst wird, wenn eine Anfrage einen Fehler zurückgibt und das Ereignis bis zum Verbindungsobjekt (
IDBDatabase
) aufsteigt. Auch über dieonerror
-Eigenschaft verfügbar.
Modus-Konstanten
Veraltet: Diese Funktion wird nicht mehr empfohlen. Obwohl einige Browser sie möglicherweise noch unterstützen, könnte sie bereits aus den relevanten Webstandards entfernt worden sein, in Kürze entfernt werden oder nur noch aus Kompatibilitätsgründen bestehen. Vermeiden Sie die Verwendung und aktualisieren Sie vorhandenen Code, falls möglich; siehe die Kompatibilitätstabelle am Ende dieser Seite, um Ihre Entscheidung zu unterstützen. Beachten Sie, dass diese Funktion jederzeit aufhören könnte zu funktionieren.
Warnung: Diese Konstanten sind nicht mehr verfügbar — sie wurden in Gecko 25 entfernt. Sie sollten stattdessen die Zeichenkettenkonstanten direkt verwenden. (Firefox-Bug 888598)
Transaktionen können einen von drei Modi haben:
Konstante | Wert | Beschreibung |
---|---|---|
READ_ONLY
|
"readonly" (0 in Chrome) | Erlaubt das Lesen von Daten, aber nicht das Ändern. |
READ_WRITE
|
"readwrite" (1 in Chrome) | Erlaubt das Lesen und Schreiben von Daten in bestehenden Daten-Stores. |
VERSION_CHANGE
|
"versionchange" (2 in Chrome) | Ermöglicht das Ausführen beliebiger Operationen, einschließlich solcher, die Objekt-Stores und Indizes löschen und erstellen. Transaktionen dieses Modus können nicht gleichzeitig mit anderen Transaktionen ausgeführt werden. Transaktionen in diesem Modus sind als "Upgrade-Transaktionen" bekannt. |
Auch wenn diese Konstanten jetzt veraltet sind, können Sie sie dennoch verwenden, um abwärtskompatibel zu sein, wenn dies erforderlich ist (in Chrome wurde die Änderung in Version 21 vorgenommen). Sie sollten defensiv programmieren, falls das Objekt nicht mehr verfügbar ist:
const myIDBTransaction = window.IDBTransaction ||
window.webkitIDBTransaction || { READ_WRITE: "readwrite" };
Beispiele
Im folgenden Code-Schnipsel öffnen wir eine Lese-/Schreibtransaktion auf unserer Datenbank und fügen einige Daten zu einem Objekt-Store hinzu. Beachten Sie auch die Funktionen, die an Transaktions-Ereignis-Handler angehängt sind, um über das Ergebnis der Transaktionsöffnung im Falle eines Erfolgs oder Misserfolgs zu berichten. Für ein vollständiges Arbeitsbeispiel siehe unsere Aufgabenbenachrichtigungen-App (Beispiel live anzeigen).
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.";
};
}
Spezifikationen
Specification |
---|
Indexed Database API 3.0 # transaction |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
- Verwendung von IndexedDB
- Starten von Transaktionen:
IDBDatabase
- Festlegen eines Schlüsselspektrums:
IDBKeyRange
- Abrufen und Ändern Ihrer Daten:
IDBObjectStore
- Verwendung von Cursoren:
IDBCursor
- Referenzbeispiel: Aufgabenbenachrichtigungen (Beispiel live anzeigen).