Signatur
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`);
};
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);
}
};
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');
};
// Wichtig · Fallstricke
- Nur bei aktiven Transaktionen: Ist die Transaktion nicht aktiv, wirft
commit()eineInvalidStateError-DOMException. Das gilt etwa, wenn sie schon abgeschlossen oder abgebrochen ist odercommit()bereits aufgerufen wurde. In einem asynchronen Rückruf außerhalb der Transaktion (z. B. nachawait fetch()) wirft er eineTransactionInactiveError. - Anfragen nach commit(): Weitere Aufrufe wie
put()oderget()werfen eineTransactionInactiveError. Rufecommit()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 einerConstraintErrordurch einen doppelten Schlüssel), wird die ganze Transaktion abgebrochen. Warte deshalb immer aufcomplete. - 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'.