IndexedDB - 事務



事務是一組操作,這些操作應該全部成功或全部失敗。例如,如果我們透過 UPI 向商家付款,而交易失敗,則資金必須退回到傳送者的帳戶。事務維護這種完整性。

以下是開啟事務的語法:

db.transaction(store[, type]);

這裡的 store 是我們想要進行事務的物件儲存。事務的型別有兩種:

  • 只讀 - 只能讀取,預設情況下提供。

  • 讀寫 - 我們只能讀取和寫入資料,但不能從物件儲存中建立、刪除或更改資料。

事務生命週期

事務是在物件儲存之間執行任何操作的連線。每個事務都有一個狀態,可以是:

  • 活動 - 當事務首次建立時,或當請求與事務關聯時。當事務處於此狀態時,可以針對事務發出新的請求。

  • 非活動 - 事務在其建立後控制返回到事件後處於此狀態。當事務處於此狀態時,不能針對事務發出任何請求。

  • 提交中 - 一旦與事務關聯的所有請求都完成,它就會嘗試提交。在提交狀態期間,無法發出新的請求。

  • 已完成 - 事務提交或中止後,它處於已完成狀態。在已完成狀態期間,無法發出新的請求。

事務的生命週期

形成了具有範圍和模式的事務。事務在生成時最初處於活動狀態。

  • 要開始事務,實現必須排隊一個任務。

  • 當處理與事務相關的每個請求時,將觸發成功或錯誤事件。當傳送事件時,事務狀態設定為活動狀態,允許針對事務發出後續請求。事件排程完成後,事務的狀態設定為非活動狀態。

  • 即使事務當前未處於活動狀態或尚未開始,也可以在完成之前隨時取消事務。

  • 當針對資料庫發出的所有請求都成功時,實現必須嘗試提交事務。

  • 當事務提交或中止時,其狀態將設定為完成。

事務排程

事務可以啟動時,有一些限制。

  • 當沒有讀或寫事務時:a. 在事務 tx 之前建立;b. 與 tx 具有重疊的範圍;c. 不處於最終狀態,只讀事務 tx 可以開始。

  • 當沒有其他事務時,可以開始讀/寫事務 tx:

    • 在 tx 之前形成的,
    • 與 tx 具有重疊的範圍,或
    • 未處於已完成狀態。

升級事務

模式為“versionchange”的事務是升級事務。

可以使用升級操作建立、重新命名和刪除資料庫中的物件儲存和索引。

如果給定大於當前版本的版本,則在完成開啟資料庫連線後的執行升級事務的步驟後,會自動生成升級事務。在此事務將在 upgradeneeded 事件處理程式中處於活動狀態。

提交事務

必須完成以下步驟才能提交事務:

  • 事務狀態首先設定為提交中。
  • 等待列表中所有事務請求都已處理。
  • 如果發生錯誤,則中止事務。
  • 如果事務是升級事務,則將資料庫升級事務的事務連線設定為 NULL。
  • 將事務狀態更改為已完成。
  • 觸發事務的完整事件
  • 如果事務是升級事務,則將請求的事務設定為 null,併發出與事務關聯的請求。

語法

transaction.commit()

嘗試提交事務。所有掛起的請求都將允許完成,但不會接受新的請求。

如果掛起的請求失敗,則事務將中止。成功請求的成功事件仍將觸發,但在事件處理程式中丟擲異常不會中止呼叫 preventDefault() 的事務將不會阻止事務中止。

事件處理程式

各種事件處理程式屬性如下:

attribute EventHandler onabort; 
attribute EventHandler oncomplete; 
attribute EventHandler onerror;

事務示例

下面給出一個簡單的 JavaScript 程式來演示事務的使用:

<!DOCTYPE html>
<html lang="en">
<head>
   <title>Document</title>
</head>
<body>
   <script>
      const request = indexedDB.open("botdatabase",1);
      request.onupgradeneeded = function(){
         const db = request.result;
         const store = db.createObjectStore("bots",{ keyPath: "id"});
      }
      request.onsuccess = function(){
         document.write("database opened successfully");
         const db = request.result;
         const transaction=db.transaction("bots","readwrite");
         const store = transaction.objectStore("bots");
         store.add({id: 1, name: "jason",branch: "IT"});
         store.add({id: 2, name: "praneeth",branch: "CSE"});
         store.add({id: 3, name: "palli",branch: "EEE"});
         store.add({id: 4, name: "abdul",branch: "IT"});
         store.put({id: 4, name: "deevana",branch: "CSE"});
         transaction.oncomplete = function(){
            document.write("transaction complete");
            db.close;
         };
      }
   </script>
</body>
</html>

輸出

database opened successfully
transaction complete

此處建立事務,只有在建立事務後,我們才能將資料新增到物件儲存中,最後在事務完成後,我們關閉資料庫。

示例

以下示例顯示了事務屬性 oncomplete 的用法:

function student(db, names) {
   let transaction = db.transaction(['names'], 'readwrite');
   let store = transaction.objectStore('names');
   for (let i = 0; i < messages.length; i++) {
      store.add({text: names[i]});
   }
   transaction.oncomplete = function()
   {document.write('transaction complete')};
}

中止事務

要中止事務,請按照以下步驟操作:

  • 撤消對資料庫的所有與事務相關的修改。

  • 在升級事務期間,物件儲存、索引和版本的更改也會被還原。

  • 完成事務狀態。

  • 如果錯誤不為空,則將事務錯誤設定為錯誤。

  • 將請求處理標誌設定為事務請求列表中每個請求為 true。

  • 將請求完成標誌設定為 true,並將結果設定為定義。

  • 如果事務是升級事務,則將與事務連線關聯的升級事務設定為 null。

  • 建立一箇中止事務事件,並將 bubbles 屬性設定為 true。

  • 如果事務是升級事務,則假設請求是事務的開啟請求。

廣告