SQLite这么娇小可爱,不多了解点都不行啊

在我眼里,MySQL 和 Oracle 是这样的

SQLite这么娇小可爱,不多了解点都不行啊

SQLite这么娇小可爱,不多了解点都不行啊

而 SQLite 在是这样的

SQLite这么娇小可爱,不多了解点都不行啊

所以这么萌的数据库,我真的应该多了解她的。

简介

SQLite,是一款轻型的数据库,是遵守 ACID 的关系型数据库管理系统。它的设计目标是嵌入式的,目前 Android 和 iOS 的设备内置的都是 SQLite 数据库。SQLite 虽然娇小,但也支持事务和多数的 SQL92 标准。

主要特点

Zero-Configuration 无需安装和管理配置。

Serverless 无需服务器支持。

Single Database File 数据文件存储在一个单一的磁盘文件。

Stable Cross-Platform Database File 数据库文件格式跨平台,无论是大小端,或者是 32bit 或 64bit 机器都没有关系

Compact 完整特性的 SQLite 编译出来在 500KiB 左右,裁剪特性甚至可以得到低于 300KiB 的库(当前版本 3.8.11.1)。

Manifest typing 可以声明数据库字段类型,但是字段存储的类型实际的存储类型和实际值相关,单独的一个字段可能包含不同存储类的值。

Variable-length records 可变长度记录,例如你存储一个字符到 VARCHAR (100) 的列,实际需要的存储空间一个字符加一个字节的存储空间。

SQL statements compile into virtual machine code SQL 语句会被编译成虚拟机代码,这种虚拟机代码直白可读,便于调试。

Public domain 完全开源。

SQL language extensions

主要缺点

SQLite 只提供数据库级的锁定,所以不支持高并发。

不支持存储过程。

SQLite 没有用户帐户概念,而是根据文件系统确定所有数据库的权限。这会使强制执行存储配额发生困难,强制执行用户许可变得不可能。

如果只在移动设备使用 SQLite,那么他的优点足够好,并且缺点不明显,所以大叔 MySQL 走开。SQLite 妹妹快过来。

事务与锁( < 3.7.0)

SQLite 的事务和锁是很重要的概念。

SQLite 有 5 个不同的锁状态

UNLOCKED(未加锁)

SHARED(共享)

RESERVED(保留)

PENDING(未决)

EXCLUSIVE(排它)

SQLite 有一个加锁表,记录数据库连接的锁状态。每个数据库连接在同一时刻只能处于其中一个锁状态。每种状态(UNLOCKED)都有一种锁与之对应。

数据库连接最初处于 UNLOCKED 状态,在此状态下,连接还没有存取数据库。当连接到了一个数据库,甚至已经用 BEGIN 开始了一个事务时,连接都还处于 UNLOCKED 状态。为了能够从数据库中读取数据,连接必须必须进入 SHARED 状态,也就是说首先要获得一个 SHARED 锁。多个连接可以同时获得并保持共享锁,也就是说多个连接可以同时从同一个数据库中读数据,SQLite 是支持并发读取数据的。

一个连接想要写数据库,它必须首先获得一个 RESERVED 锁。一个数据库上同时只能有一个 RESERVED 锁,保留锁可以与共享锁共存,RESERVED 锁即不阻止其它拥有 SHARED 锁的连接继续读数据库,也不阻止其它连接获得新的 SHARED 锁。 一旦一个连接获得了 RESERVED 锁,它就可以将数据写入缓冲区,而不是实际地写到磁盘。 当连接想要提交修改(或事务)时,需要获得 PENDING 锁,之后连接就不能再获得新的 SHARED 锁了,但已经拥有 SHARED 锁的连接仍然可以继续正常读数据库。当所有其它 SHARED 锁都被释放时,拥有 PENDING 锁的连接就可以将其锁提升至 EXCLUSIVE 锁,此时就可以将以前对缓冲区所做的修改写到数据库文件。所以SQLite 是不支持并发写的。

事务

SQLite 有三种不同的事务

DEFERRED(推迟)

MMEDIATE(立即)

EXCLUSIVE(排它)

事务类型在 BEGIN 命令中指定:

SQLite这么娇小可爱,不多了解点都不行啊

DEFERRED

一个 DEFERRED 事务不获取任何锁(直到它需要锁的时候),BEGIN 语句本身也不会做什么事情——它开始于 UNLOCK 状态。默认情况下就是这样的,如果仅仅用 BEGIN 开始一个事务,那么事务就是 DEFERRED 的,同时它不会获取任何锁;当对数据库进行第一次读操作时,它会获取 SHARED 锁;同样,当进行第一次写操作时,它会获取 RESERVED 锁。

MMEDIATE

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8dfffc66e3725536179c52c827a25c43.html