Start · Sprachen · JavaScript · Referenz · IDBTransaction.commit()

IDBTransaction.commit()

Methode

Schließt eine aktive IndexedDB-Transaktion sofort ab, statt zu warten, bis keine Anfragen mehr offen sind und die Transaktion automatisch committet wird.

seit JavaScript Baseline 2023: Chrome 76, Firefox 74, Safari 15 Kategorie: webapi

Signatur

IDBTransaction.prototype.commit()

Beschreibung

IndexedDB-Transaktionen werden normalerweise automatisch abgeschlossen. Das passiert, sobald alle gestellten Anfragen erledigt sind und der Code in keinem Erfolgs- oder Fehler-Handler mehr neue Anfragen stellt. commit() löst diesen Abschluss sofort aus. Danach nimmt die Transaktion keine weiteren Anfragen mehr an. Bereits gestellte Anfragen werden aber noch vollständig ausgeführt.

Das lohnt sich vor allem, wenn eine Transaktion viele Schreibvorgänge enthält und du danach nichts mehr lesen willst. Der Browser muss dann nicht erst den Ereignis-Durchlauf abwarten und kann die Änderungen früher auf die Festplatte schreiben. Das verringert die Latenz. Außerdem machst du im Code klar sichtbar, wo die Transaktion endet.

Ob die Daten wirklich gespeichert wurden, zeigt nicht der Aufruf von commit(), sondern erst das complete-Ereignis der Transaktion. Schlägt eine der offenen Anfragen fehl, wird die Transaktion trotz commit() abgebrochen, und es feuern error und abort.

Beispiele

Viele Datensätze schreiben und sofort committen

const saveAll = (db, items) => new Promise((resolve, reject) => {
  const tx = db.transaction('produkte', 'readwrite');
  const store = tx.objectStore('produkte');

  for (const item of items) {
    store.put(item);
  }

  // Keine weiteren Anfragen geplant – sofort abschließen
  tx.commit();

  tx.oncomplete = () => resolve(items.length);
  tx.onerror = () => reject(tx.error);
  tx.onabort = () => reject(tx.error ?? new Error('Transaktion abgebrochen'));
});

const open = indexedDB.open('shop', 1);
open.onupgradeneeded = () => open.result.createObjectStore('produkte', { keyPath: 'id' });
open.onsuccess = async () => {
  const count = await saveAll(open.result, [
    { id: 1, name: 'Tastatur' },
    { id: 2, name: 'Maus' }
  ]);
  console.log(`${count} Produkte gespeichert`);
};
2 Produkte gespeichert

Nach commit() sind keine neuen Anfragen mehr erlaubt

const demo = (db) => {
  const tx = db.transaction('produkte', 'readwrite');
  const store = tx.objectStore('produkte');
  store.put({ id: 3, name: 'Monitor' });
  tx.commit();

  try {
    store.put({ id: 4, name: 'Webcam' });
  } catch (err) {
    console.log(err.name);
  }
};
TransactionInactiveError

Mit Feature-Erkennung aufrufen

const finish = (tx) => {
  // Ältere Browser kennen commit() nicht – dort committet IndexedDB automatisch
  if (typeof tx.commit === 'function') {
    tx.commit();
  }
};

const req = indexedDB.open('shop', 1);
req.onsuccess = () => {
  const tx = req.result.transaction('produkte', 'readwrite');
  tx.objectStore('produkte').put({ id: 5, name: 'Headset' });
  finish(tx);
  tx.oncomplete = () => console.log('Fertig');
};
Fertig

// Wichtig · Fallstricke

  • Nur bei aktiven Transaktionen: Ist die Transaktion nicht aktiv, wirft commit() eine InvalidStateError-DOMException. Das gilt etwa, wenn sie schon abgeschlossen oder abgebrochen ist oder commit() bereits aufgerufen wurde. In einem asynchronen Rückruf außerhalb der Transaktion (z. B. nach await fetch()) wirft er eine TransactionInactiveError.
  • Anfragen nach commit(): Weitere Aufrufe wie put() oder get() werfen eine TransactionInactiveError. Rufe commit() deshalb erst auf, wenn du alle Anfragen gestellt hast.
  • Kein Ersatz für complete: commit() garantiert nicht, dass die Daten gespeichert werden. Schlägt eine offene Anfrage fehl (z. B. wegen einer ConstraintError durch einen doppelten Schlüssel), wird die ganze Transaktion abgebrochen. Warte deshalb immer auf complete.
  • Nicht nötig: Ohne commit() wird die Transaktion trotzdem automatisch abgeschlossen. Die Methode ist eine Optimierung und keine Pflicht.
  • Kompatibilität: Unterstützt ab Chrome/Edge 76, Firefox 74 und Safari 15. In älteren Umgebungen hilft eine Feature-Erkennung per typeof tx.commit === 'function'.