IDBRequest.transaction

IDBRequest インターフェイスの読み取り専用プロパティ transaction は、要求のトランザクション、すなわちこの要求がその中で生成されたトランザクションを返します。

このプロパティは、IDBFactory.open が返した要求 (データベースに接続するだけなので、返すべきトランザクションが存在しない) など、トランザクション内で生成されていない要求では null になり得ます。データベースを開くときにバージョンの更新が必要な場合は、upgradeneeded イベントハンドラーの実行中、transaction プロパティは mode"versionchange" と等しい IDBTransaction となり、既存のオブジェクトストアやインデックスにアクセスしたり、更新を中止したりするのに使用できます。更新の後は、transaction プロパティは再び null になるでしょう。

メモ: この機能はウェブワーカー内で利用可能です。

IDBTransaction です。

以下の例では、指定のタイトルのレコードを要求し、onsuccessIDBObjectStore から (objectStoreTitleRequest.result として参照できるようになった) 対応するレコードを取得し、レコードのプロパティ 1 個を更新し、更新したレコードを別の要求でオブジェクトストアに書き戻します。要求元を開発者コンソールに記録します。両方とも同じトランザクションに由来しています。動く例全体は、To-do Notifications アプリケーションを参照してください。(動く例を見る)

js
const title = "Walk dog";

// 通常通りトランザクションを開始します
const objectStore = db
  .transaction(["toDoList"], "readwrite")
  .objectStore("toDoList");

// 指定の title をタイトルとして持つ TO-DO リストのオブジェクトを取得します
const objectStoreTitleRequest = objectStore.get(title);

objectStoreTitleRequest.onsuccess = () => {
  // result として返されたデータオブジェクトを取得します
  const data = objectStoreTitleRequest.result;

  // オブジェクトの notified の値を "yes" に更新します
  data.notified = "yes";

  // アイテムをデータベースに書き戻す別の要求を生成します
  const updateTitleRequest = objectStore.put(data);

  // この要求が由来するトランザクションを記録します
  console.log(
    `この要求が由来するトランザクションは ${updateTitleRequest.transaction} です`,
  );

  // 新しい要求が成功したら、また displayData() 関数を
  // 実行し、表示を更新します
  updateTitleRequest.onsuccess = () => {
    displayData();
  };
};

この例では、transaction プロパティをバージョンの更新中に既存のオブジェクトストアへアクセスするのに使う方法を示します。

js
const openRequest = indexedDB.open("db", 2);
console.log(openRequest.transaction); // "null" が記録されるはずです

openRequest.onupgradeneeded = (event) => {
  console.log(openRequest.transaction.mode); // "versionchange" が記録されるはずです
  const db = openRequest.result;
  if (event.oldVersion < 1) {
    // 新規データベースなので、オブジェクトストア "books" を作成します。
    db.createObjectStore("books");
  }
  if (event.oldVersion < 2) {
    // v1 データベースからの更新です。オブジェクトストア "books" の "title" にインデックスを追加します。
    const bookStore = openRequest.transaction.objectStore("books");
    bookStore.createIndex("by_title", "title");
  }
};

openRequest.onsuccess = () => {
  console.log(openRequest.transaction); // "null" が記録されるはずです
};

仕様書

Specification
Indexed Database API 3.0
# ref-for-dom-idbrequest-transaction①

ブラウザーの互換性

BCD tables only load in the browser

関連情報