
- IndexedDB 教程
- IndexedDB - 首頁
- IndexedDB - 簡介
- IndexedDB - 安裝
- IndexedDB - 連線
- IndexedDB - 物件儲存
- IndexedDB - 建立資料
- IndexedDB - 讀取資料
- IndexedDB - 更新資料
- IndexedDB - 刪除資料
- 使用 getAll() 函式
- IndexedDB - 索引
- IndexedDB - 範圍
- IndexedDB - 事務
- IndexedDB - 錯誤處理
- IndexedDB - 搜尋
- IndexedDB - 遊標
- IndexedDB - Promise 包裝器
- IndexedDB - ECMAScript 繫結
- IndexedDB 有用資源
- IndexedDB - 快速指南
- IndexedDB - 有用資源
- IndexedDB - 討論
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。
如果事務是升級事務,則假設請求是事務的開啟請求。