微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

学习使用SQLite版本3.7.4中J

事务的类型:

事务三种不同的类型,以不同的锁状态启动事务。

在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,连接缓冲区大小:

控制一个连接可以在内存中使用多少个数据库页。方式:pragmacache_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+……构架网站,这是后话。源码是目前的重点。

原文地址:https://www.jb51.cc/sqlite/201783.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐