SQLite的事务处理方式
SQLite把每一條SQL語句解釋為一個事務(wù),這就是事務(wù)處理自動提交模式;也可以通過begin...commit語句實(shí)現(xiàn)對多條SQL語句的包裹,也就是多條SQL語句在一個事務(wù)中進(jìn)行處理,這就是用戶提交模式。
寫事務(wù)擦寫flash事務(wù)處理流程:
1.申請共享鎖(shared lock)
在寫數(shù)據(jù)庫之前,必須先讀取數(shù)據(jù)庫的格式以及所要修改的數(shù)據(jù)頁。
每個sqlite數(shù)據(jù)庫都有一個只讀表sqlite_master,他定義數(shù)據(jù)庫的模式
1 create table sqlite_master( 2 type TEXT, 3 name TEXT, 4 tbl_name TEXT, 5 rootpage INTEGER, 6 sql TEXT 7 );type字段:‘table’,‘index’,‘view’,‘trigger’;'table'可以是普通表和虛擬表(virtual)
name字段:表、索引、視圖、觸發(fā)器名稱
tbl_name字段:對于表和視圖,tbl_name=name;對于索引,tbl_name是該索引所屬的表的名稱;對于觸發(fā)器,tbl_name存儲引起觸發(fā)器動作的表或視圖名稱
rootpage字段:對于表和索引,存儲root b-tree的頁數(shù);對于視圖、觸發(fā)器和虛擬表,rootpage=0 || NULL
sql字段:‘CREATE TABLE’,‘CREATE VIEW’,‘CREATE INDEX’,‘CREATE VIRTUAL TABLE’,‘CREATE TRIGGER’
2.從數(shù)據(jù)庫讀取信息
數(shù)據(jù)頁首先從flash讀到系統(tǒng)緩存,然后從系統(tǒng)緩存?zhèn)鬟f到用戶空間,用戶空間與系統(tǒng)緩存都位于RAM中。
3.申請一個預(yù)留鎖(reserved lock)
在修改數(shù)據(jù)庫文件之前,寫事務(wù)必須獲得其預(yù)留鎖,意味著寫事務(wù)將來會寫數(shù)據(jù)庫,現(xiàn)階段只讀取數(shù)據(jù)庫,reserved lock和shared lock可以同時存在,但是只能有一個reserved lock和多個shared lock。
4.生成回滾日志文件
申請預(yù)留鎖成功之后,會在系統(tǒng)緩存中生成回滾日志文件,并要把要修改頁的原始數(shù)據(jù)寫入回滾日志。
5.修改用戶空間的數(shù)據(jù)頁
6.刷回滾日志文件到flash
回滾日志刷新是二次刷新,首先將回滾日志內(nèi)容(原始數(shù)據(jù))刷新至flash;然后將頁總數(shù)寫入回滾日志文件頭,將文件頭刷新至flash
7.獲得一個獨(dú)享鎖(exclusive lock)
任何需要寫數(shù)據(jù)庫文件的事務(wù)必須獲得獨(dú)享鎖,任意時刻只有一個事務(wù)可以獲得獨(dú)享鎖
8.將修改數(shù)據(jù)寫入到數(shù)據(jù)庫文件中
將用戶空間的數(shù)據(jù)寫入操作系統(tǒng)緩存
9.刷新修改頁到flash
10.刪除回滾日志文件
11.釋放exclusive lock
轉(zhuǎn)載于:https://www.cnblogs.com/binger1990/archive/2012/10/08/2715676.html
總結(jié)
以上是生活随笔為你收集整理的SQLite的事务处理方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 富文本编辑器---笑脸表情(一)
- 下一篇: MySQL基本操作及乱码问题的解决方法