SQLite数据库
ACID(数据库事务正确执行的四个基本要素的缩写)
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
原子性
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性
隔离性
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性
在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
由于一项操作通常会包含许多子操作,而这些子操作可能会因为硬件的损坏或其他因素产生问题,要正确实现ACID并不容易。ACID建议数据库将所有需要更新以及修改的资料一次操作完毕,但实际上并不可行。
实现
目前主要有两种方式实现ACID:第一种是Writeahead logging,也就是日志式的方式(现代数据库均基于这种方式)。第二种是Shadow paging。
相对于WAL(write aheadlogging)技术,shadow paging技术实现起来比较简单,消除了写日志记录的开销恢复的速度也快(不需要redo和undo)。shadow paging的缺点就是事务提交时要输出多个块,这使得提交的开销很大,而且以块为单位,很难应用到允许多个事务并发执行的情况——这是它致命的缺点。
WAL 的中心思想是对数据文件的修改(它们是表和索引的载体)必须是只能发生在这些修改已经记录了日志之后 -- 也就是说,在日志记录冲刷到永久存储器之后.如果我们遵循这个过程,那么我们就不需要在每次事务提交的时候都把数据页冲刷到磁盘,因为我们知道在出现崩溃的情况下,我们可以用日志来恢复数据库:任何尚未附加到数据页的记录都将先从日志记录中重做(这叫向前滚动恢复,也叫做 REDO)然后那些未提交的事务做的修改将被从数据页中删除(这叫向后滚动恢复 - UNDO)。
SQLite
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。
工作原理
不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
功能特性
1.ACID事务;
2.零配置 – 无需安装和管理配置;
3.储存在单一磁盘文件中的一个完整的数据库;
4.数据库文件可以在不同字节顺序的机器间自由的共享;
5.支持数据库大小至2TB;
6.足够小, 大致13万行C代码, 4.43M;
7.比一些流行的数据库在大部分普通数据库操作要快;
8.简单, 轻松的API;
9.包含TCL绑定, 同时通过Wrapper支持其他语言的绑定;
10.良好注释的源代码, 并且有着90%以上的测试覆盖率;
11.独立: 没有额外依赖;
12.源码完全的开源, 你可以用于任何用途, 包括出售它;
13.支持多种开发语言,C, C++, PHP, Perl, Java, C#, Python, Ruby等;
SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,它支持的SQL:
l ATTACH DATABASE
l BEGIN TRANSACTION
l Comment
l COMMIT TRANSACTION
l COPY
l CREATE INDEX
l CREATE TABLE
l CREATE TRIGGER
l CREATE VIEW
l DELETE
l DETACH DATABASE
l DROP INDEX
l DROP TABLE
l DROP TRIGGER
l DROP VIEW
l END TRANSACTION
l EXPLAIN
l Expression
l INSERT
l ON CONFLICT clause
l PRAGMA
l REPLACE
l ROLLBACK TRANSACTION
l SELECT
l UPDATE
同时它还支持事务处理功能等等。也有人说它像Microsoft的Access,有时候真的觉得有点像,但是事实上它们区别很大。比如SQLite支持跨平台,操作简单,能够使用很多语言直接创建数据库,而不像Access一样需要Office的支持。如果你是个很小型的应用,或者你想做嵌入式开发,没有合适的数据库系统,那么你可以考虑使用SQLite。
数据类型
SQLite是无类型(Typelessness)的。这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么(只有在一种情况下不是, 即在字段类型为”Integer Primary Key”时)。对于SQLite来说对字段不指定类型是完全有效的。如:
Create Table ex1(a, b, c);
诚然SQLite允许忽略数据类型, 但是仍然建议在你的CreateTable语句中指定数据类型。因为数据类型对于你和其他的程序员交流, 或者你准备换掉你的数据库引擎时能起到一个提示或帮助的作用。SQLite支持常见的数据类型, 如:
CREATE TABLE ex2
a VARCHAR(10),
b NVARCHAR(15),
c TEXT,
d INTEGER,
e FLOAT,
f BOOLEAN,
g CLOB,
h BLOB,
i TIMESTAMP,
j NUMERIC(10,5)
k VARYING CHARACTER (24),
l NATIONAL VARYING CHARACTER(16)
SQLite 常用函数
SQLite有许多内置函数用于处理字符串或数字数据。下面列出了一些有用的SQLite内置函数,且所有函数都是大小写不敏感,这意味着您可以使用这些函数的小写形式或大写形式或混合形式。
序号 | 函数 | 描述 |
1 | SQLite COUNT | 用来计算一个数据库表中的行数。 |
2 | SQLite MAX | 选择某列的最大值。 |
3 | SQLite MIN | 选择某列的最小值。 |
4 | SQLite AVG | 计算某列的平均值。 |
5 | SQLite SUM | 为一个数值列计算总和。 |
6 | SQLite RANDOM | 返回一个介于 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数。 |
7 | SQLite ABS | 返回数值参数的绝对值。 |
8 | SQLite UPPER | 把字符串转换为大写字母。 |
9 | SQLite LOWER | 把字符串转换为小写字母。 |
10 | SQLite LENGTH | 返回字符串的长度。 |
11 | SQLite sqlite_version | 返回 SQLite 库的版本。 |
注意事项
在确定是否在应用程序中使用SQLite 之前,应该考虑以下几种情况:
有没有可用于SQLite的网络服务器。从应用程序运行位于其他计算机上的SQLite的惟一方法是从网络共享运行。这样会导致一些问题,像UNIX和Windows网络共享都存在文件锁定问题。还有由于与访问网络共享相关的延迟而带来的性能下降问题。
SQLite只提供数据库级的锁定。虽然有一些增加并发的技巧,但是,如果应用程序需要的是表级别或行级别的锁定,那么DBMS能够更好地满足您的需求。
SQLite可以支持每天大约100,00次点击率的Web站点 —— 并且,在某些情况下,可以处理10倍于此的通信量。对于具有高通信量或需要支持庞大浏览人数的Web站点来说,应该考虑使用DBMS。
SQLite没有用户帐户概念,而是根据文件系统确定所有数据库的权限。这会使强制执行存储配额发生困难,强制执行用户许可变得不可能。
SQLite支持多数(但不是全部)的SQL92标准。不受支持的一些功能包括完全触发器支持和可写视图。
如果您感到其中的任何限制会影响您的应用程序,那么您应该考虑使用完善的 DBMS。如果您可以解除这些限制问题,并且对快速灵活的嵌入式开源数据库引擎很感兴趣,则应重点考虑使用SQLite。
一些能够真正表现SQLite优越性能的领域是Web站点,可以使用SQLite管理应用程序数据、快速应用程序原型制造和培训工具。
由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地,它将为那些以前无法提供用作持久数据的后端的数据库的应用程序提供了高效的性能。如今没有必要使用文本文件来实现持久存储。SQLite之类的嵌入式数据库的易于使用性可以加快应用程序的开发,并使得小型应用程序能够完全支持复杂的SQL。这一点对于对于小型设备空间的应用程序来说尤其重要。