1

次のコードがあります。

transaction = db.transaction("myStore", "readwrite");
objStore = transaction.objectStore(myStore);
Index = objStore.index(key);
request = Index.openCursor(field);
request.onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    request = objStore.delete(cursor.value.key);
    request.onsuccess = function(event) {
      console.log("delete successful");
      return;
    };

トランザクション スコープは「myStore」です。返されたカーソル データを再帰的に削除できるよう
に、トランザクションを参照し続けて存続させることができます。

これは、全体を通して同じトランザクションであるため、データの削除に問題があると、削除されたすべてのトランザクションがロールバックされるということですか?

4

1 に答える 1

2

トランザクションは、一貫した状態を得るために発生する必要があるいくつかのアクションが成功することを保証します。失敗した場合、つまり一貫性のない状態になる場合は、元の状態にロールバックする必要があります。具体例で。ある口座から別の口座に送金する場合、両方の残高の一部が同じである場合にのみ、一貫した状態を持つことができます。つまり、値が 1 つのアカウントから再描画された場合、一貫した状態を得るために他のアカウントに追加する必要があります。どちらか一方が失敗すると、トランザクションは元の状態に戻ります。

そのため、パフォーマンスやその他の目的でトランザクションを存続させることは、適切な選択ではありません。また、indexeddb API トランザクションは自動コミットされます。つまり、トランザクションにアクションが含まれていないか、非アクティブになると、変更がコミットされます。

あなたの質問を答える最後のポイントとして。同じトランザクション内で削除が失敗した場合、同じトランザクションで実行されたすべての削除はロールバックされます。この動作が望ましくない場合は、複数のトランザクションを作成する必要があります。

于 2013-02-02T13:22:17.943 に答える