IDBDatabase.transaction()
此方法可以建立一個事務物件,與一個或者多個物件倉庫相關聯。
IndexedDB資料庫中,物件倉庫的增刪改查或者結構性修改都需要藉助於事務。
關於事務更多內容可以參閱indexedDB transaction 事務一章節。
語法結構:
[JavaScript] 純文字檢視 複製程式碼let transaction = IDBDatabase.transaction(storeNames, mode);
引數解析:
(1).storeNames:必需,與事務關聯的物件倉庫名稱,可以是多種形式,後面會通過程式碼例項演示。
(2).mode:可選,表示事務操作型別的字串,readonly和readwrite,如果省略,預設為readonly。
在當前標準下,事務有三種操作型別,分別是readonly、readwrite和versionchange 。
但是versionchange型別不能人為的規定,此型別事務會在upgradeneeded事件觸發時自動建立。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> let students=[ { id:1001, name:"張三", age:21, sex:"男" },{ id:1002, name:"李四", age:20, sex:"女" },{ id:1003, name:"王五", age:19, sex:"女" } ]; let request = window.indexedDB.open("antzone", 1); request.onupgradeneeded = (ev) => { let db = ev.target.result; if (!db.objectStoreNames.contains('students')) { let objectStore = db.createObjectStore('students',{autoIncrement:true}); objectStore.createIndex("xingbie","sex",{ unique: false }); } } request.onsuccess = (ev) => { let db = ev.target.result; let transaction = db.transaction(['students'], 'readwrite'); let objectStore = transaction.objectStore('students'); for(let i=0;i<students.length;i++){ objectStore.add(students[i]); } console.log(objectStore.transaction); } </script> </head> <body> <p>列印物件倉庫操作所在的事務</p> </body> </html>
上述程式碼可以為物件倉庫批量新增三條記錄,分析如下:
(1).如果資料庫不存在,那麼首先建立資料庫"antzone",併為其建立物件倉庫"students"。
(2).如果資料庫已經存在,那麼開啟資料庫,並在success事件處理函式中為物件倉庫新增記錄。
(3).物件倉庫的增刪改查等操作都要藉助於事務,所以首先要建立事務。
(4).db.transaction(['students'], 'readwrite'),建立與"students"物件倉庫關聯的事務,操作型別可讀寫。
(5).然後利用transaction.objectStore('students')獲取對應的物件倉庫,進行相關的操作。
IDBDatabase.transaction()方法的引數可以使如下幾種形式:
(1).字串,也就是一個物件倉庫的名稱。
(2).陣列,陣列元素是物件倉庫名稱,一次可以關聯多個物件倉庫。
(3).db.objectStoreNames,一次關聯多個物件倉庫,具體參閱IDBDatabase.objectStoreNames一章節。
特別說明:如果是隻讀操作,那麼操作型別不要寫為"readwrite",會影響效能。