indexedDB transaction 事務
如果是後臺程式設計人員,那麼對資料庫事務一定非常熟悉,因為這是必須要掌握的知識。
indexedDB資料庫中同樣具有事務,目的與關係型資料庫是一樣的,確保資料庫操作的安全。
一.事務的必要性:
事務可以確保資料操作的安全性,如果資料操作中途出現意外,資料會回滾到最初的狀態。
不會出現修改部分資料的情況,這對於確保資料安全具有重要的意義,下面舉一個例子。
比如銀行A賬戶向B賬戶轉賬,在轉賬資料庫操作過程中突然出現意外,錢已經從A賬戶轉走,但是B還未收到。
這絕對是一個嚴重的問題,但是由於事務的存在,則會將兩個賬號回滾到最初的狀態,不存在資料部分修改。
二.程式碼例項:
首先給出一段程式碼例項,並對其進行一個簡單分析,以期對事務有一個直觀的感受。
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> 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',{keyPath:"id"}); 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'); objectStore.add({ id:1, name:"螞蟻部落", age:20, sex:"男" }); } </script> </head> <body> <p>通過事務為資料新增一條資料</p> </body> </html>
上述程式碼執行效果截圖如下:
上面程式碼將對應的資料寫入資料庫,程式碼分析如下:
(1).關於資料庫的建立與開啟本文不再詳細介紹,具體參閱相關閱讀。
(2).資料庫開啟成功後會觸發success,在事件處理函式中利用事務完成資料新增工作。
(3).通過IDBDatabase資料庫物件的transaction()方法建立一個事務,此方法接受兩個引數,第一個引數是陣列,陣列元素是此事務涉及到的物件倉庫,第二個引數規定事務的模式,上述程式碼設定事務是可讀寫的。
(4).然後再通過事務物件的objectStore()方法獲取對應的物件倉庫。
(5).最後利用物件倉庫的add()方法新增對應的資料。
三.事務模式:
對於資料庫操作主要如下幾種方式:
(1).讀取資料。
(2).讀寫資料。
(3).修改資料庫結構的schema。
事務具有三種模式:
(1).readonly:只讀模式,僅用於讀取資料。
(2).readwrite:讀寫模式,用於資料庫讀資料或者寫資料。
(3).verionchange:版本變更模式,用於資料庫讀寫資料或者修改資料庫結構的schema。
在前面的程式碼例項中演示了資料庫的"readwrite"讀寫模式,"read"模式很簡單也很容易理解,不再演示。
關於transaction()方法更多內容可以參閱IDBDatabase.transaction() 建立事務一章節。
可能很多朋友對於verionchange模式感覺比較陌生,好像從來都沒有見到過它的應用。
並非如此,對於資料庫結構的修改,比如索引的建立刪除或者物件倉庫的建立刪除等都會在此事務模式下進行。
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> 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',{keyPath:"id"}); objectStore.createIndex("studentname","name",{ unique: false }); } } </script> </head> <body> <p>建立一個資料庫,並新增物件倉庫</p> </body> </html>
上述程式碼建立一個資料庫,並新增物件倉庫,程式碼執行效果截圖如下:
上述程式碼建立了一個資料庫,然後新增物件倉庫,並設定主鍵與索引,但是並未看到事務的應用。
當觸發upgradeneeded事件之時,會自動建立一個模式為"verionchange"的事務,注意不能人工建立。
通過下面程式碼例項做一下證明:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> let request = window.indexedDB.open("antzone", 2); request.onupgradeneeded = (ev) => { let db = ev.target.result; if (!db.objectStoreNames.contains('students')) { let objectStore = db.createObjectStore('students',{keyPath:"id"}); objectStore.createIndex("studentname","name",{ unique: false }); } console.log(ev.target.transaction.mode) } </script> </head> <body> <p>建立一個資料庫,並新增物件倉庫</p> </body> </html>
程式碼執行效果截圖如下:
注意要修改indexedDB.open()方法的第二個引數,以便觸發upgradeneeded事件。
四.注意事項:
(1)."readonly"事務可以同時作用於同一個物件倉庫或者索引。
(2)."readwrite"事務不能同時作用於同一個物件倉庫或者索引,只能夠按照順序操作。
(3)."verionchange"事務可以用於新增刪除或者更新資料,但更多的是用於建立物件倉庫和對物件倉庫的配置操作,此事務不能手動建立,而是在upgradeneeded事件觸發時自動建立,並且此事務具有排他性,當它在執行的時候,不能有其他事務同時執行。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> let request = window.indexedDB.open("antzone", 2); request.onupgradeneeded = (ev) => { let db = ev.target.result; if (!db.objectStoreNames.contains('students')) { let objectStore = db.createObjectStore('students',{keyPath:"id"}); } let trans = db.transaction(['students'], "readwrite"); let objectstore= trans.objectStore("students"); let addReq = objectstore.add({id:1,name:"螞蟻部落",age:5,address:"青島市南區"}); } </script> </head> <body> <p>verionchange模式事務具有排他性</p> </body> </html>
程式碼執行效果截圖如下:
上述程式碼可以修改如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <script> let request = window.indexedDB.open("antzone", 2); request.onupgradeneeded = (ev) => { let db = ev.target.result; if (!db.objectStoreNames.contains('students')) { let objectStore = db.createObjectStore('students',{keyPath:"id"}); } let trans = ev.target.transaction; let objectstore= trans.objectStore("students"); let addReq = objectstore.add({id:1,name:"螞蟻部落",age:5,address:"青島市南區"}); } </script> </head> <body> <p>verionchange模式事務同樣具有讀寫功能</p> </body> </html>
程式碼執行效果截圖如下:
上述程式碼並沒有建立新的事務,依然是使用upgradeneeded觸發時建立的事務。
相關文章
- DAPPER 事務 TRANSACTIONAPP
- oracle set transaction read only與dbms_transaction實現事務transaction控制Oracle
- Oracle ITL (Interested Transaction List) - 事務槽OracleREST
- 分散式事務 TCC-Transaction 原始碼分析 —— 事務恢復分散式原始碼
- SQL基礎-->資料庫事務(TRANSACTION)SQL資料庫
- 分散式事務 TCC-Transaction 原始碼解析 —— 事務儲存器分散式原始碼
- 關於事務的英文說明 Transaction OverviewView
- mysql隱式提交事務transaction一點筆記MySql筆記
- Spring_11 Transaction(事務) 使用(XML 配置方式)SpringXML
- Spring Transaction詳解 – 手動回滾事務Spring
- Spring中事務管理org.springframework.transactionSpringFramework
- 3分鐘搞懂MySQL事務隔離級別及SET TRANSACTION影響事務MySql
- oracle事務隔離級別transaction isolation level初識Oracle
- 分散式事務 TCC-Transaction 原始碼分析 —— Dubbo 支援分散式原始碼
- SQLSERVER事務日誌已滿 the transaction log for database 'xx' is fullSQLServerDatabase
- skip a transaction in goldengate(跳過一個事務OGG)Go
- 使用FLASHBACK_TRANSACTION_QUERY查詢回滾事務SQLSQL
- oracle undo segment header 事務表transaction table系列一OracleHeader
- oracle資料庫事務transaction 不同的鎖lock型別Oracle資料庫型別
- oracle資料庫事務transaction鎖lock模式思考之一Oracle資料庫模式
- PostgreSQL 原始碼解讀(225)- Transaction(子事務處理)SQL原始碼
- oracle事務transaction鎖lock一點兒小思考或總結Oracle
- PostgreSQL 原始碼解讀(228)- Transaction(事務系統簡介)SQL原始碼
- 分散式事務 TCC-Transaction 原始碼分析 —— 運維平臺分散式原始碼運維
- Spring事務(Transaction)管理高階篇一棧式解決開發中遇到的事務問題Spring
- 分散式事務 TCC-Transaction 原始碼分析 —— 除錯環境搭建分散式原始碼除錯
- tcc-transaction分散式TCC型事務框架搭建與使用記錄分散式框架
- Oracle 如何判斷一個死事務transaction的恢復進度Oracle
- Django處理事務:transactionDjango
- oracle資料庫事務不同事務隔離級別與v$transaction flag列思考Oracle資料庫
- [資料庫]--Transaction那點事兒資料庫
- oracle不同的事務transaction隔離級別isolation level進一步理解Oracle
- Laravel transaction : Laravel 的事務是不支援 eloquent 的? 要用 DB::的方式?為啥Laravel
- Spring Transaction詳解 – 異常發生時的事務回滾機制Spring
- oracle資料庫事務transaction隔離級別isolation level的選擇依據Oracle資料庫
- v$transaction事務_v$session會話_v$rollstat_v$rollname關聯測試_概念Session會話
- 初探IndexedDBIndex
- indexedDB articleIndex