IDBDatabase.transaction()

admin發表於2019-09-20

此方法可以建立一個事務物件,與一個或者多個物件倉庫相關聯。

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",會影響效能。