Start · Sprachen · JavaScript · Referenz · IDBTransaction.mode

IDBTransaction.mode

Eigenschaft

Schreibgeschützte Eigenschaft, die den Zugriffsmodus der Transaktion liefert: <code>"readonly"</code>, <code>"readwrite"</code> oder <code>"versionchange"</code>.

seit JavaScript Baseline: alle modernen Browser Kategorie: webapi

Signatur

IDBTransaction.mode

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). Mehrere readonly-Transaktionen dürfen parallel auf dieselben Speicher zugreifen.
  • "readwrite": Lesen und Schreiben (add(), put(), delete(), clear()). Überlappende readwrite-Transaktionen werden nacheinander ausgeführt.
  • "versionchange": Sondermodus, der nur im upgradeneeded-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

Typ
"readonly" | "readwrite" | "versionchange"
Beschreibung
Zeichenkette mit dem Zugriffsmodus der Transaktion.

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);
};
versionchange readonly readwrite

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);
Gespeichert unter 42

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);
}
readonly → ReadOnlyError

// Wichtig · Fallstricke

  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wie tx.mode = 'readwrite' wird im Sloppy-Modus einfach ignoriert und wirft im Strict-Modus einen TypeError. 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ür ReadOnlyError.
  • "versionchange" kann man nicht an db.transaction() übergeben, sonst gibt es einen TypeError. Dieser Modus entsteht nur über indexedDB.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_ONLY usw.). Diese sind veraltet und wurden entfernt. Heute liefern alle aktuellen Browser Zeichenketten. In Web Workern ist die Eigenschaft ebenfalls verfügbar.