title | slug |
---|---|
IDBTransaction |
Web/API/IDBTransaction |
{{APIRef("IndexedDB")}}
IDBTransaction
は IndexedDB API のインターフェイスで、イベントハンドラー属性を使用してデータベース上の静的で非同期のトランザクションを提供します。すべてのデータの読み書きはトランザクション内で行われます。{{domxref("IDBDatabase")}} を使用してトランザクションを開始し、{{domxref("IDBTransaction")}} を使用してトランザクションのモードを設定し (例 readonly
または readwrite
)、{{domxref("IDBObjectStore")}} にアクセスしてリクエストを作成します。IDBTransaction
オブジェクトを使用してトランザクションを中止することもできます。
{{AvailableInWorkers}}
{{InheritanceDiagram}}
トランザクションは、最初のリクエストが発行された時ではなく、トランザクションが生成されたときに開始します。例えば、次のものを考えてください。
var trans1 = db.transaction("foo", "readwrite");
var trans2 = db.transaction("foo", "readwrite");
var objectStore2 = trans2.objectStore("foo");
var objectStore1 = trans1.objectStore("foo");
objectStore2.put("2", "key");
objectStore1.put("1", "key");
このコードが実行された後で、オブジェクトストアには "2" が含まれているはずであり、これは trans2
が trans1
の後に実行されるからです。
トランザクションは一定数の理由で失敗することがあり、(ユーザーエージェントのクラッシュを除いて) すべての場合に abort
コールバックを起動します。
- 不正な要求による失敗。例えば、
add()
で同じキーを 2 回追加しようとしたり、put()
で一意性制約に反して同じインデックスキーを追加しようとした場合。これは要求のエラーを起こし、このエラーはトランザクションのエラーとして伝搬し、これによりトランザクションがアボートします。これは、要求のerror
イベントでpreventDefault()
を用いることで回避できます。 - スクリプトによる明示的な
abort()
の呼び出し。 - 要求の
success
/error
ハンドラー内での補足されない例外。 - I/O エラー (ディスクへの書き込みの失敗や、他の OS / ハードウェアのエラーなど)
- 制限の超過。
- ユーザーエージェントのクラッシュ。
Firefox 40 以降、IndexedDB のトランザクションはパフォーマンスを向上させるために永続性の保証が緩くなりました。(Firefox バグ 1112702 を参照してください) これまでは、readwrite
のトランザクションでは {{domxref("IDBTransaction.oncomplete")}} は全てのデータがディスクに書き込まれたことが保証されてからのみ発火していました。Firefox 40+ では、complete
イベントは OS にデータの書き込みを指示した後発火しますが、データが実際にディスクに書き込まれるより前の可能性があります。complete
イベントは以前より早く通知されますが、データがディスクに書き込まれるより前にシステムの電源が失われたり、OS がクラッシュしたりすると、小さい確率でトランザクション全体が失われます。このような壊滅的な事象はほとんど起こらないため、ほとんどの利用者は心配しなくていいでしょう。
何らかの理由で永続性を保証する必要がある場合 (たとえば、後で再計算できない重要なデータを保存しようとしている場合) 実験的な (標準でない) readwriteflush
モードを利用してトランザクションを生成することで、complete
イベントを通知する前にディスクへ書き込むことを強制することができます。({{domxref("IDBDatabase.transaction")}} を参照してください)
- {{domxref("IDBTransaction.db")}} {{readonlyInline}}
- : このトランザクションが紐づいているデータベースへの接続です。
- {{domxref("IDBTransaction.error")}} {{readonlyInline}}
- : トランザクションが失敗したとき、発生したエラーの種類を表す {{domxref("DOMException")}} を返します。トランザクションが完了していないとき、完了して正常にコミットしたとき、{{domxref("IDBTransaction.abort()")}} 関数によりアボートされたときは
null
です。
- : トランザクションが失敗したとき、発生したエラーの種類を表す {{domxref("DOMException")}} を返します。トランザクションが完了していないとき、完了して正常にコミットしたとき、{{domxref("IDBTransaction.abort()")}} 関数によりアボートされたときは
- {{domxref("IDBTransaction.mode")}} {{readonlyInline}}
- : トランザクションの対象のオブジェクトストア内のデータへのアクセスを隔離するためのモードです。デフォルト値は
readonly
です。
- : トランザクションの対象のオブジェクトストア内のデータへのアクセスを隔離するためのモードです。デフォルト値は
- {{domxref("IDBTransaction.objectStoreNames")}} {{readonlyInline}}
- : トランザクションに関連付いた {{domxref("IDBObjectStore")}} の名前を格納した {{domxref("DOMStringList")}} を返します。
{{domxref("EventTarget")}} から継承します。
- {{domxref("IDBTransaction.abort()")}}
- : このトランザクションに関連付いたデータベース内のオブジェクトへの変更をロールバックします。このトランザクションがアボート済または完了済のときは、このメソッドは
error
イベントを発火します。
- : このトランザクションに関連付いたデータベース内のオブジェクトへの変更をロールバックします。このトランザクションがアボート済または完了済のときは、このメソッドは
- {{domxref("IDBTransaction.objectStore()")}}
- : このトランザクションの対象に含まれるオブジェクトストアを表す {{domxref("IDBObjectStore")}} オブジェクトを返します。
- {{domxref("IDBTransaction.commit()")}}
- : 進行中のトランザクションをコミットします。なお、このメソッドは通常呼ばれる 必要 はありません。進行中の要求が全て満たされ、新しい要求がなされなかったとき、トランザクションは自動的にコミットされます。
commit()
は、進行中の要求からのイベントが処理されるのを待たずにコミット処理を開始するために使用できます。
- : 進行中のトランザクションをコミットします。なお、このメソッドは通常呼ばれる 必要 はありません。進行中の要求が全て満たされ、新しい要求がなされなかったとき、トランザクションは自動的にコミットされます。
addEventListener()
を用いるか、このインターフェイスの oneventname
プロパティにイベントリスナーを代入することにより、これらのイベントをリッスンします。
abort
- :
IndexedDB
のトランザクションがアボートされたとき発火します。onabort
プロパティからも利用可能です。
- :
complete
- : トランザクションが正常に完了したとき発火します。
oncomplete
プロパティからも利用可能です。
- : トランザクションが正常に完了したとき発火します。
error
- : 要求がエラーを返し、イベントがトランザクションオブジェクトに伝搬したとき発火します。
onerror
プロパティからも利用可能です。
- : 要求がエラーを返し、イベントがトランザクションオブジェクトに伝搬したとき発火します。
{{ deprecated_header(13) }}
Warning
これらの定数はもう利用可能ではありません。Gecko 25 で削除されました。かわりに、これらの文字列定数を直接使用するべきです。(Firefox バグ 888598)
トランザクションはこれらの 3 種類のモードのうち 1 個を持つことができます。
定数 | 値 | 説明 |
---|---|---|
READ_ONLY |
"readonly" (Chrome では 0) |
データの読み取りができますが、変更はできません。 |
READ_WRITE |
"readwrite" (Chrome では 1) |
変更対象のデータストア内のデータの読み書きができます。 |
VERSION_CHANGE |
"versionchange" (Chrome では 2) |
オブジェクトストアやインデックスの作成や削除を含む任意の操作を行えます。このモードは、{{domxref("IDBDatabase")}} オブジェクトの setVersion() メソッドにより開始されたトランザクションでバージョン番号を更新する用です。このモードのトランザクションは、他のトランザクションと並行で実行することはできません。このモードのトランザクションは、"upgrade transactions" と呼ばれます。 |
これらの定数は現在非推奨ですが、後方互換性を維持するために必要に応じてこれらの定数を使用することができます。(Chrome では、バージョン 21 で変更がありました) これらのオブジェクトが利用できなくなっている場合に備え、以下のような保守的なコードを書くべきです。
var myIDBTransaction = window.IDBTransaction ||
window.webkitIDBTransaction || { READ_WRITE: "readwrite" };
次のコードスニペットでは、我々のデータベース上で読み書きのトランザクションを開き、オブジェクトストアにデータを追加します。成功または失敗した時にトランザクションの結果を知らせるため、トランザクションにアタッチしている関数にも注目してください。動く例全体は、To-do Notifications アプリケーション (動く例を見る) を見てください。
// 我々のデータベースを開きましょう
var DBOpenRequest = window.indexedDB.open("toDoList", 4);
DBOpenRequest.onsuccess = function (event) {
note.innerHTML += "<li>データベースを初期化しました。</li>";
// データベースを開いた結果を変数 db に保存します。
// これは後でたくさん使います。
db = DBOpenRequest.result;
// データベースにデータを追加します
addData();
};
function addData() {
// IDB に挿入する新しいオブジェクトを作成します
var newItem = [
{
taskTitle: "Walk dog",
hours: 19,
minutes: 30,
day: 24,
month: "December",
year: 2013,
notified: "no",
},
];
// 読み書きのトランザクションを開き、データの追加の準備をします
var transaction = db.transaction(["toDoList"], "readwrite");
// トランザクションを開くことに成功したら報告します
transaction.oncomplete = function (event) {
note.innerHTML +=
"<li>トランザクション完了 : データベースの変更が完了しました。</li>";
};
transaction.onerror = function (event) {
note.innerHTML +=
"<li>トランザクションはエラーのため開けませんでした。重複するアイテムは許されません。</li>";
};
// トランザクション上でオブジェクトストアを生成します
var objectStore = transaction.objectStore("toDoList");
// オブジェクトストアに newItem オブジェクトを加えます
var objectStoreRequest = objectStore.add(newItem[0]);
objectStoreRequest.onsuccess = function (event) {
// 要求の成功を報告します (これは DB に項目が正常に保存されたという
// ことではありません。これの確認には、transaction.oncomplete が必要です)
note.innerHTML += "<li>要求に成功しました。</li>";
};
}
{{Specifications}}
{{Compat}}
- IndexedDB の使用
- トランザクションの開始 : {{domxref("IDBDatabase")}}
- トランザクションの使用 : {{domxref("IDBTransaction")}}
- キーの範囲の設定 : {{domxref("IDBKeyRange")}}
- データの受け取りや変更 : {{domxref("IDBObjectStore")}}
- カーソルの使用 : {{domxref("IDBCursor")}}
- リファレンスの例 : To-do Notifications (動く例を見る)