Start · Sprachen · JavaScript · Referenz · IDBRequest.transaction

IDBRequest.transaction

Eigenschaft

Schreibgeschützte Eigenschaft, die die <code>IDBTransaction</code> zurückgibt, in der die Anfrage gestellt wurde, oder <code>null</code>, wenn es keine gibt.

seit JavaScript Baseline: alle Browser (IndexedDB 1.0) Kategorie: webapi

Signatur

IDBRequest.transaction

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

Typ
IDBTransaction | null
Beschreibung
Die 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');
  };
};
Modus: readwrite 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);
};
Transaktionsmodus: versionchange transaction nach Upgrade: null

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');
};
Bestellung verworfen // bei summe <= 0

// Wichtig · Fallstricke

  • Kann null sein: Bei IDBOpenDBRequest gibt es nur während upgradeneeded eine 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, in setTimeout oder nach einem fetch() eine neue Anfrage über request.transaction, schlägt sie mit TransactionInactiveError fehl.
  • 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.