Signatur
Beschreibung
Die schreibgeschützte Eigenschaft mode eines IDBTransaction-Objekts gibt an, in welchem Modus die Transaktion auf die Objektspeicher (Object Stores) zugreift. Der Modus wird beim Anlegen der Transaktion über IDBDatabase.transaction(storeNames, mode) festgelegt und lässt sich danach nicht mehr ändern.
Mögliche Werte:
"readonly": Nur lesender Zugriff (Standardwert). Mehrerereadonly-Transaktionen dürfen parallel auf dieselben Speicher zugreifen."readwrite": Lesen und Schreiben (add(),put(),delete(),clear()). Überlappendereadwrite-Transaktionen werden nacheinander ausgeführt."versionchange": Sondermodus, der nur imupgradeneeded-Handler automatisch entsteht. Nur hier dürfen Objektspeicher und Indizes angelegt oder gelöscht werden.
Praktisch nutzt man mode vor allem in Hilfsfunktionen, die eine fremde Transaktion übergeben bekommen: Bevor geschrieben wird, prüft man, ob der Modus das überhaupt erlaubt. So vermeidet man eine ReadOnlyError-DOMException.
Rückgabewert
Beispiele
Modus einer neuen Transaktion auslesen
const request = indexedDB.open('shop', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
// Im Upgrade-Handler läuft eine versionchange-Transaktion
console.log(event.target.transaction.mode);
db.createObjectStore('produkte', { keyPath: 'id' });
};
request.onsuccess = (event) => {
const db = event.target.result;
const tx1 = db.transaction('produkte');
const tx2 = db.transaction('produkte', 'readwrite');
console.log(tx1.mode);
console.log(tx2.mode);
};
Schreibrecht vor dem Speichern prüfen
const speichereProdukt = (tx, produkt) => {
if (tx.mode === 'readonly') {
throw new Error('Transaktion ist schreibgeschützt – bitte "readwrite" verwenden.');
}
return new Promise((resolve, reject) => {
const req = tx.objectStore('produkte').put(produkt);
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
};
// Nutzung (db ist eine geöffnete IDBDatabase)
const tx = db.transaction('produkte', 'readwrite');
const key = await speichereProdukt(tx, { id: 42, name: 'Tastatur' });
console.log('Gespeichert unter', key);
Fehler beim Schreiben in readonly-Transaktion
const tx = db.transaction('produkte'); // Standard: readonly
try {
tx.objectStore('produkte').add({ id: 1, name: 'Maus' });
} catch (err) {
console.log(tx.mode, '→', err.name);
}
// Wichtig · Fallstricke
- Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wie
tx.mode = 'readwrite'wird im Sloppy-Modus einfach ignoriert und wirft im Strict-Modus einenTypeError. Wer einen anderen Modus braucht, muss eine neue Transaktion anlegen. - Wird beim Aufruf von
db.transaction()kein Modus angegeben, gilt"readonly". Das ist die häufigste Ursache fürReadOnlyError. "versionchange"kann man nicht andb.transaction()übergeben, sonst gibt es einenTypeError. Dieser Modus entsteht nur überindexedDB.open()mit einer höheren Versionsnummer.- Für bessere Leistung sollte man
"readwrite"nur verwenden, wenn wirklich geschrieben wird:readonly-Transaktionen können parallel laufen,readwrite-Transaktionen auf dieselben Speicher blockieren sich gegenseitig. - Ältere Implementierungen lieferten numerische Konstanten (
IDBTransaction.READ_ONLYusw.). Diese sind veraltet und wurden entfernt. Heute liefern alle aktuellen Browser Zeichenketten. In Web Workern ist die Eigenschaft ebenfalls verfügbar.