Signatur
Beschreibung
Die schreibgeschützte Eigenschaft transaction eines IDBRequest verweist auf die IDBTransaction, zu der die Anfrage gehört. Jede Lese- oder Schreiboperation auf einem Object Store oder Index, zum Beispiel get(), put(), add(), delete() oder openCursor(), läuft innerhalb einer Transaktion. Über diese Eigenschaft erreichst du die Transaktion direkt aus dem Request-Objekt oder aus event.target in einem Event-Handler.
Praktisch ist das vor allem in Callbacks, in denen keine Variable mit der Transaktion greifbar ist. Du kannst dort zum Beispiel weitere Anfragen in derselben Transaktion stellen (request.transaction.objectStore(...)), auf complete oder error der Transaktion reagieren oder sie mit abort() abbrechen.
Ein Sonderfall ist IDBOpenDBRequest, also der Request, den indexedDB.open() zurückgibt. Während des Events upgradeneeded liefert transaction die versionchange-Transaktion. Nur mit ihr kannst du bestehende Object Stores ändern, etwa Indizes hinzufügen. Außerhalb des Upgrades, zum Beispiel im success-Handler, ist der Wert null.
Rückgabewert
IDBTransaction, in der die Anfrage gestellt wurde. null gibt es nur bei Open-Requests (IDBOpenDBRequest) außerhalb eines Versions-Upgrades.Beispiele
Transaktion im success-Handler einer Leseanfrage nutzen
const openReq = indexedDB.open('shop', 1);
openReq.onupgradeneeded = () => {
openReq.result.createObjectStore('produkte', { keyPath: 'id' });
};
openReq.onsuccess = () => {
const db = openReq.result;
const store = db.transaction('produkte', 'readwrite').objectStore('produkte');
store.put({ id: 1, name: 'Tastatur', bestand: 5 });
const getReq = store.get(1);
getReq.onsuccess = (event) => {
const tx = event.target.transaction;
console.log('Modus:', tx.mode);
// Weitere Anfrage in derselben Transaktion
const produkt = event.target.result;
produkt.bestand -= 1;
tx.objectStore('produkte').put(produkt);
tx.oncomplete = () => console.log('Bestand aktualisiert');
};
};
Index während upgradeneeded zu bestehendem Store hinzufügen
const req = indexedDB.open('shop', 2);
req.onupgradeneeded = (event) => {
const db = req.result;
if (event.oldVersion < 1) {
db.createObjectStore('produkte', { keyPath: 'id' });
}
if (event.oldVersion < 2) {
// Bestehenden Store nur über die versionchange-Transaktion erreichbar
const store = req.transaction.objectStore('produkte');
store.createIndex('nachName', 'name', { unique: false });
console.log('Transaktionsmodus:', req.transaction.mode);
}
};
req.onsuccess = () => {
console.log('transaction nach Upgrade:', req.transaction);
};
Transaktion bei ungültigen Daten abbrechen
const speichereBestellung = (db, bestellung) => {
const store = db.transaction('bestellungen', 'readwrite').objectStore('bestellungen');
const req = store.add(bestellung);
req.onsuccess = () => {
if (bestellung.summe <= 0) {
// Alle Änderungen dieser Transaktion zurückrollen
req.transaction.abort();
}
};
req.transaction.onabort = () => console.warn('Bestellung verworfen');
req.transaction.oncomplete = () => console.log('Bestellung gespeichert');
};
// Wichtig · Fallstricke
- Kann
nullsein: BeiIDBOpenDBRequestgibt es nur währendupgradeneededeine Transaktion. Prüfe den Wert vorher, wenn der Handler in mehreren Situationen läuft. - Transaktionen schließen sich automatisch: Eine Transaktion bleibt nur aktiv, solange in ihren Event-Callbacks neue Anfragen gestellt werden. Stellst du nach einem
await, insetTimeoutoder nach einemfetch()eine neue Anfrage überrequest.transaction, schlägt sie mitTransactionInactiveErrorfehl. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert und wirft im Strict Mode einen
TypeError. - Über die Transaktion eines Requests erreichst du nur Object Stores aus ihrem Geltungsbereich (Scope). Andere Stores werfen
NotFoundError. - Kompatibilität: Wird von allen aktuellen Browsern und in Web Workern unterstützt. In privaten Fenstern mancher Browser ist IndexedDB eingeschränkt.