事务的类型:
事务三种不同的类型,以不同的锁状态启动事务。
在begin命令中指定事务类型:begin [ deferred | immediate | exclusive ] transaction ;
deferred必须到使用是才能获取锁。默认从未锁定状态开始。以deferred开始的事务,是延迟的,停留在未锁定状态。多个连接可以在同时刻未创建任何锁的情况下开始延迟事务。这种情况下,第一个对数据库的读操作获取共享锁,第一个对数据库的写操作获取预留锁。
immediate事务在begin的时候就视图获取预留锁。若成功,begin immediate保证无其他连接写数据库,但是其他连接可以读取数据库。预留锁的另一个结果是没有其他连接能成功启动begin immediate或者 begin exclusive命令,当其他连接执行上述命令时,SQLite会返回SQLite_busy错误。这时候可以修改数据库,但不能提交,使用commit时会有SQLite_busy错误。也就是说,还没有读事务完成,得继续等待。
exclusive事务会试着获取排他锁,类似于immediate事务,值得注意的是,在获取排他锁后,数据库没其他的活动链接,本连接可以任意读写数据库。
数据库管理:
附加数据库:
SQLite允许利用attach命令将多个数据库定位”附加“到当前连接上,在全局范围内他的内容都是可取的。
语法形式: attach [database] filename as database_name;
filename是SQLite数据库的文件名和路径,database_name 是要引用的数据库和对象的逻辑名称。主数据库自动赋名为main。如果创建临时对象,SQLite会自动创建一个附加的数据库,并且命名为temp。逻辑名称可以用来引用附加数据库内的对象,于此同时,引用附加数据库的对象必须提供逻辑名。这个在两个数据库中有相同的表的时候,很管用。
使用全名引用数据库中的对象:
分离数据库:
detach [database] database_name;
数据库清理:
命令:reindex(用于重建索引,重建所有使用指定排序名称的索引) 和 vacuum (重构数据库清理未使用的空间 ,开放状态的事务,vacuum是不执行的)。
reindex的用法:reindex collation_name;
reindex table_name | index_name ;
vacuum的用法: VACUUM [index
-
or
-
table
-
name
]
数据库配置:
SQLite没有配置文件,其所有的配置参数都是利用pragma实现的。这个pragma有着命令和变量的特点。
编译指示中的常用的内容:
a,连接缓冲区大小:
控制一个连接可以在内存中使用多少个数据库页。方式:pragma cache_size;
注意:可以使用default_cache_size编译指示来默认所有的连接设置永久缓冲区的大小。
这种设置可以存储于数据库中,只是对以后的连接生效,对当前的连接不起作用。缓冲其实可以在事务为预留锁的时候,存储待定的变
化。缓冲区大对于获取排他锁之前能做的事情量是有鼓励的。
b, 获取数据库信息:
database_list : 获取所有附着的数据库,
为看的清楚起见,我把临时建立的数据库temp.db附加到test.db上了。
index_info : 列举出索引内字段的相关信息。索引名作为参数,
index_list : 列出表中的索引信息。表名作为参数。
table_info : 列出表中所有字段的相关信息。
c,写同步:
通常,SQLite会在关键时刻将所有的变化提交到磁盘保证事务的持久性。但是,因为影响性能,可以考虑关闭这个功能。
编译指示synchronous来实现。该编译指示的三种设置:full , normal ,off。
full:在继续前,在关键点暂停以确保所有的数据实际写入磁盘。确保了即使系统崩溃或者电力中断,重启后数据库依然是未损的。很安全,但慢。
normal:在大多关键点暂停,但是不太频繁了。某个电力中断可能导致数据库受损。实际中,可能会遭受严重的磁盘操作失败或者其他不课恢复的硬件故障。
off:将数据抛给OS后立即继续工作。加速50倍左右,但是问题是,如果运行SQLite的应用程序崩溃,数据依然是安全的。如果系统崩溃或者停电,可能会导致数据损毁。
d,临时存储器:
保存临时数据(临时的表、索引、其他对象)的地方。
两个编译指示控制临时存储器:
temp_store :决定是使用内存还是磁盘作为临时存储器;三个选项:default(使用内编译的默认项),file(使用OS文件),memory
(使用内存);
temp_store_directory:存储临时文件的目录,但是在file作为存储介质的情况下。
e,页大小、编码和自动清理:
必须在创建数据库前设置。
数据库大小可以通过auto_vacuum自动保持在最小。启动auto_vacuum时,删除的事务提交时,数据库会变小。vacuum对使用auto_vacuum的数据库不起作用。
f,调试:
四个调试的编译指示:integrity_check 可查看次序颠倒的记录、缺失、畸形记录、损毁的索引等。如果损毁,返回描述问题的字符串,如正常,返回ok。其他编译指示追踪解析器和虚拟数据库引擎,只要数据库编译时启用了调试信息,就可以启用这些编译指示。
系统目录:
系统表:sqlite_master,包含所有表、视图、索引和触发器的信息。
rootpage指的是对象的第一个B-tree页面在数据库文件中的位置。
查看查询计划:
利用explain query plan查看SQLite执行查询的方法。在此命令后加上查询文本。
----------------------------《over》-------------------------------
小记:历时20天,共计21篇。还会在后面继续写,直到深入内核,读懂源码。最后,学习PHP,利用PHP+SQLite+……构架网站,这是后话。源码是目前的重点。