SQLite权威指南

SQLite权威指南(第二版)第五章 SQLite设计与概念

2019-10-29  本文已影响0人  风月灯

本章是后面几章的基础,阅读本章可以更好的理解SQLite API和一些SQLite架构与实现

一、API

1、主要数据结构

1.1 连接和语句

API中与查询处理有关的两个基本数据结构是连接(connection<=>sqlite3)和语句(statement<=>sqlite_stmt)

1.2 B-tree和Pager

一个Connection可以连接到多个数据库对象(一个主数据库和多个附加数据库)。每个数据库对象都有一个B-tree和相应的一个pager对象

2.核心API

执行SQL 准备查询+封装查询

2.1 连接数据库
2.2 执行预查询

准备(编译)>执行->完成 (Preparation Execution Finalization)


Statement precessing
# 1. 打开数据库)Open the database, create a connection object (db)
db = open('foods.db')
# 2.A. 准备)Prepare a statement
stmt = db.prepare('select * from episodes')
# 2.B. 执行)Execute. Call step() is until cursor reaches end of result set.
while stmt.step() == SQLITE_ROW
print stmt.column('name')
end
# 2.C. 完成)Finalize. Release read lock.
stmt.finalize()
# 4. 插入一条记录)Insert a record
stmt = db.prepare('INSERT INTO foods VALUES (…)')
stmt.step()
stmt.finalize()
# 5. 关闭数据库)Close database connection.
db.close()
2.3 使用参数化SQL

SQL语句可以包含参数,参数是编译后的对应绑定值的占位对象

2.4 执行封装查询
2.5 错误处理
2.6 SQL语句格式化

******* SQL注入攻击*****

可操作的控制

使用线程

二、扩展API

1.创建用户自定义函数

2.创建用户自定义聚合

3.创建用户自定义排序

三、事务

1.事务生命周期

2.锁状态

3.读事务

4. 写事务

如图5-3,写操作会进入EXCLUSIVE状态

4.1 保留状态
4.2 待定状态
4.3 独占状态
4.4 自动提交与效率

LOCKING AND CRASH RECOVERY(锁与故障恢复)

数据库文件中包含3种文件锁:保留字节、待定字节、共享区域


Snip20191029_6.png

四、跳转页面缓存

PageCache满会发生什么?

1.过渡到独占状态

2.调整页面缓存

五、Waiting For锁

写操作时,独占之前会PENDING →EXCLUSIVE,这个PENDING状态会等待一段时间,每当SQLite遇到不能回去锁的情况时,会返回SQLITE_BUSY,遇到SQLITE_BUSY需要重新调用吗?

1. 自定义繁忙回调

2. 处理恰当的事务

六、代码

1.使用多个连接

c1 = open('foods.db')
c2 = open('foods.db')
stmt = c1.prepare('select * from episodes')
while stmt.step()
print stmt.column('name')
c2.exec('update episodes set <some columns, criteria, etc.>)
end
stmt.finalize()
c1.close()
c2.close()
c1 = open('foods.db')
# Keep trying until we get it
while c1.exec('begin immediate') != SQLITE_SUCCESS
end
stmt = c1.prepare('select * from episodes')
c1 = open('foods.db')
# Keep trying until we get it
while c1.exec('begin immediate') != SQLITE_SUCCESS
end
stmt = c1.prepare('select * from episodes')

2. finalize()函数的重要性

3. 共享缓存模式

七、总结

上一篇 下一篇

猜你喜欢

热点阅读