SQLITE中的填空判断知识点
- 格式:docx
- 大小:14.46 KB
- 文档页数:4
sqlite数据库常⽤语句这个⽂件型数据库⼩巧好⽤,可以替代ACCESS,以下是常⽤的语句获取数据库时间(设计表字段时的当前时间默认值) sqlite datetime('now', 'localtime')如果使⽤这个函数CURRENT_TIMESTAMP,得到的时间可能不正确,因为时区不对,⼀般会少8个⼩时 sqlserver getdate()获取前10个记录 sqlite select * from table order by AddTime desc limit 0,10 或者 select * from table order by AddTime desc limit 10 offset 0(表⽰应该跳过的⾏数) sqlserver select top 10 * from table order by AddTime随机返回数据记录 // 随机返回两条记录 sqlite select * from table ORDER BY RANDOM() limit 2like查询 SELECT * from table where SearchKey like '%员⼯%';在C#中实现参数化查询; // 1.事先拼成%参数值%形式 string key="%"+参数值+"%"; // 2.然后在语句中写上,列名 like @key(上⾯拼好的部分),也就是说,like后⾯的部分包含%符号全部当成参数 SELECT * from table where SearchKey like @key; // 这⾥如果写成和sqlserver这种( like '%'+@key+'%' ),则查不出数据,原因未知. // 3.在添加参数时 Parameters.Add(new SQLiteParameter(@key, key));插⼊记录,判断名字是否重复,如果重复则不插⼊: insert into userinfo(id,username) select '100001', 'Tom' where not exists(select id from userinfo where username='Tom')参数化查询时,参数名可以重复: insert into userinfo(id,username,bz1,bz2,bz3) values(@id,@username,@bz,@bz,@bz) 三个bz字段都使⽤了@bz⼀个参数名,但可以执⾏成功. 如果是sqlserver就会报"变量名在查询批次或存储过程内部必须唯⼀" 的错误。
sqlite概述选择题SQLite是一种轻型的、嵌入式的、零配置的、开源的关系数据库管理系统(DBMS),具有体积小、便携、高性能、免费、开源等优点。
SQLite主要特点:无需服务器端运行,直接读取数据文件;充分利用了现有的硬件设施和软件资源,比如文件系统;支持SQL92的绝大部分SQL语法,操作简单。
选择题:1.下面哪个操作与SQLite真正的数据存储和读取、写入文件无关? A.查询操作 B.删除操作 C.更新操作 D.创建操作正确答案:A解析:SQLite将数据存储在本地文件中,执行查询操作时可以直接读取本地文件中的数据,不涉及数据的存储和读取、写入文件的过程。
2.SQLite支持的数据类型有哪些? A.int、float、double、text、blob B.int、float、double、varchar、blob C.int、real、double、text、blob D.int、real、double、string、blob 正确答案:C解析:SQLite支持的数据类型包括:整型(int)、实数型(real)、双精度型(double)、字符型(text)和二进制型(blob)。
3.SQLite的存储方式是? A.数据库文件为一个文件,所有的表在这个文件中 B.每个表都是一个独立的文件C.所有的表都存储在RAM中 D.以上都不对正确答案:A解析:SQLite将所有的数据都存储在一个文件中,这个文件是一个含有所有表、索引、视图和其他元素的二进制文件,这个文件可以被复制、备份、传输等操作。
4.以下哪个SQL语句可以用来创建新表? A.CREATE INDEX B.CREATE VIEW C.CREATE TRIGGER D.CREATE TABLE 正确答案:D解析:CREATE TABLE语句用于创建新表,可以定义表名、字段、用户、权限等信息。
5.SQLite中的主键有什么作用? A.主键保证每一行的唯一性 B.主键用于连接不同的表 C.主键用于添加外键约束 D.以上都正确正确答案:A解析:主键用来标识表中的每一行数据,保证每一行的唯一性和数据完整性,不允许出现重复或空的记录。
sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常不错的嵌入式数据库,SQLite大量的被用于手机,PDA,MP3播放器以及机顶盒设备。
Mozilla Firefox使用SQLite作为数据库。
Mac计算机中的包含了多份SQLite的拷贝,用于不同的应用。
PHP将SQLite作为内置的数据库。
Skype客户端软件在内部使用SQLite。
SymbianOS(智能手机操作平台的领航)内置SQLite。
AOL邮件客户端绑定了SQLite。
Solaris 10在启动过程中需要使用SQLite。
McAfee杀毒软件使用SQLite。
iPhones使用SQLite。
Symbian和Apple以外的很多手机生产厂商使用SQLite。
下面就sqlite中的常用命令和语法介绍可下载不同操作系统的相关版本sqlite gedit也可以使用火狐中的插件sqlite manager新建数据库sqlite3 databasefilename检查databasefilename是否存在,如果不存在就创建并进入数据库(如果直接退出,数据库文件不会创建)如果已经存在直接进入数据库对数据库进行操作sqlite中命令:以.开头,大小写敏感(数据库对象名称是大小写不敏感的).exit.help 查看帮助针对命令.database 显示数据库信息;包含当前数据库的位置.tables 或者.table 显示表名称没有表则不显示.schema 命令可以查看创建数据对象时的SQL命令;.schema databaseobjectname查看创建该数据库对象时的SQL的命令;如果没有这个数据库对象就不显示内容,不会有错误提示.read FILENAME 执行指定文件中的SQL语句.headers on/off 显示表头默认off.mode list|column|insert|line|tabs|tcl|csv 改变输出格式,具体如下sqlite> .mode listsqlite> select * from emp;7369|SMITH|CLERK|7902|17-12-1980|800||207499|ALLEN|SALESMAN|7698|20-02-1981|1600|300|30如果字段值为NULL 默认不显示也就是显示空字符串sqlite> .mode columnsqlite> select * from emp;7369 SMITH CLERK 7902 17-12-1980 800 207499 ALLEN SALESMAN 7698 20-02-1981 1600 300 307521 WARD SALESMAN 7698 22-02-1981 1250 500 30sqlite> .mode insertsqlite> select * from dept;INSERT INTO table VALUES(10,'ACCOUNTING','NEW YORK');INSERT INTO table VALUES(20,'RESEARCH','DALLAS');INSERT INTO table VALUES(30,'SALES','CHICAGO');INSERT INTO table VALUES(40,'OPERATIONS','BOSTON');sqlite> .mode linesqlite> select * from dept;DEPTNO = 10DNAME = ACCOUNTINGLOC = NEW YORKDEPTNO = 20DNAME = RESEARCHLOC = DALLASDEPTNO = 30DNAME = SALESLOC = CHICAGODEPTNO = 40DNAME = OPERATIONSLOC = BOSTONsqlite> .mode tabssqlite> select * from dept;10 ACCOUNTING NEW YORK20 RESEARCH DALLAS30 SALES CHICAGO40 OPERATIONS BOSTON sqlite> .mode tclsqlite> select * from dept; "10" "ACCOUNTING" "NEW YORK" "20" "RESEARCH" "DALLAS" "30" "SALES" "CHICAGO" "40" "OPERATIONS" "BOSTON" sqlite> .mode csvsqlite> select * from dept;10,ACCOUNTING,"NEW YORK"20,RESEARCH,DALLAS30,SALES,CHICAGO40,OPERATIONS,BOSTON.separator "X" 更改分界符号为X sqlite> .separator '**'sqlite> select * from dept;10**ACCOUNTING**"NEW YORK"20**RESEARCH**DALLAS30**SALES**CHICAGO40**OPERATIONS**BOSTON.dump ?TABLE? 生成形成数据库表的SQL脚本.dump 生成整个数据库的脚本在终端显示.output stdout 将输出打印到屏幕默认.output filename 将输出打印到文件(.dump .output 结合可将数据库以sql 语句的形式导出到文件中).nullvalue STRING 查询时用指定的串代替输出的NULL串默认为.nullvalue ''字段类型:数据库中存储的每个值都有一个类型,都属于下面所列类型中的一种,(被数据库引擎所控制)NULL: 这个值为空值INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8个字节REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.TEXT: 文本. 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).BLOB: 值是BLOB数据,如何输入就如何存储,不改变格式.值被定义为什么类型只和值自身有关,和列没有关系,和变量也没有关系.所以sqlite被称作弱类型数据库数据库引擎将在执行时检查、解析类型,并进行数字存储类型(整数和实数)和文本类型之间的转换.SQL语句中部分的带双引号或单引号的文字被定义为文本,如果文字没带引号并没有小数点或指数则被定义为整数,如果文字没带引号但有小数点或指数则被定义为实数,如果值是空则被定义为空值.BLOB数据使用符号X'ABCD'来标识.但实际上,sqlite3也接受如下的数据类型:smallint 16位的整数。
sqlite布尔值SQLite是一种轻量级的嵌入式数据库引擎,它支持布尔值作为数据类型。
布尔值表示真或假,用于表示逻辑上的真实性。
在SQLite中,布尔值可以用整数1和0来表示,其中1表示真,0表示假。
本文将围绕SQLite布尔值展开,探讨其在数据库中的应用和使用技巧。
一、SQLite布尔值的定义和存储方式SQLite中的布尔值是以整数形式存储的,其中1代表真,0代表假。
这种存储方式使得布尔值在数据库中的使用非常便捷,可以直接进行运算和比较。
在创建数据库表时,可以使用布尔值作为列的数据类型,例如:CREATE TABLE users (id INTEGER PRIMARY KEY,name TEXT,is_active INTEGER);在上述示例中,is_active列的数据类型是INTEGER,用于存储布尔值。
二、SQLite布尔值的应用场景1. 条件查询布尔值在条件查询中非常有用。
例如,我们可以使用布尔值来筛选出所有活跃用户:SELECT * FROM users WHERE is_active = 1;上述查询语句将返回所有is_active为1的用户记录。
2. 数据统计布尔值还可以用于统计数据库中满足特定条件的记录数量。
例如,我们可以使用布尔值来计算活跃用户的数量:SELECT COUNT(*) FROM users WHERE is_active = 1;上述查询语句将返回满足条件is_active为1的用户记录数量。
3. 排序布尔值可以用于排序操作,例如按照活跃状态对用户进行排序:SELECT * FROM users ORDER BY is_active DESC;上述查询语句将返回按照is_active列降序排列的用户记录。
三、SQLite布尔值的使用技巧1. 插入布尔值在插入数据时,可以直接使用1或0来表示布尔值。
例如,插入一个活跃用户:INSERT INTO users (name, is_active) VALUES ('John', 1);上述语句将插入一个用户名为John,活跃状态为真的用户记录。
android sqlite基本知识Android SQLite是一种轻量级的嵌入式关系型数据库,广泛应用于Android应用程序的数据存储和管理。
本文将介绍Android SQLite 的基本知识,包括创建数据库、创建表、插入数据、查询数据、更新数据和删除数据等操作。
一、创建数据库在Android中使用SQLite数据库,首先要创建一个数据库。
可以通过继承SQLiteOpenHelper类来实现数据库的创建和版本管理。
SQLiteOpenHelper类提供了两个重要的方法,onCreate()和onUpgrade()。
onCreate()方法在数据库第一次被创建时调用,onUpgrade()方法在数据库版本发生变化时调用。
二、创建表数据库中的数据以表的形式存储。
在SQLite中,可以使用SQL语句来创建表,包括指定表的名称、字段名称和字段类型等。
创建表的操作通常在onCreate()方法中完成。
三、插入数据插入数据是将数据添加到表中的过程。
可以使用SQL语句的INSERT INTO语句来插入数据。
在Android中,可以使用ContentValues类来封装要插入的数据。
通过调用insert()方法,将封装好的ContentValues对象传入,即可实现数据的插入操作。
四、查询数据查询数据是从表中检索数据的过程。
可以使用SQL语句的SELECT 语句来查询数据。
在Android中,可以使用query()方法来执行查询操作。
query()方法接收多个参数,包括要查询的表名称、要查询的字段名称和查询条件等。
五、更新数据更新数据是修改表中已有数据的过程。
可以使用SQL语句的UPDATE语句来更新数据。
在Android中,可以使用update()方法来执行更新操作。
update()方法接收多个参数,包括要更新的表名称、要更新的字段和更新条件等。
六、删除数据删除数据是从表中删除数据的过程。
可以使用SQL语句的DELETE FROM语句来删除数据。
sqlite 语句1.SQLite数据库是一种嵌入式数据库,它的数据就是一个scores.db2.经常被集成到各种应用程序中,甚至ios、Android、Mac OS、Linux3.Python中内置了SQLite数据库,直接使用4.数据库:关系型数据库,一个数据库有多少张表,表和表之间通过主外键进行关联5.Python中操作Sqlite数据库a.获取connectionb.连接之后需要打开游标cursor,通过cursor执行sql语句c.关闭连接,释放资源二:增,删,改,查数据库1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server---创建备份数据的deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'---开始备份BACKUP DATABASE pubs TO testBack4、说明:创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:A:create table tab_new like tab_old (使用旧表创建新表)B:create table tab_new as select col1,col2…from tab_old definition only5、说明:删除新表drop table tabname6、说明:增加一个列Alter table tabname add column col type注:列增加后将不能删除。
DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
sqlite判断语句SQLite是一种轻量级的关系型数据库管理系统,支持各种数据类型和SQL语句。
其中,判断语句是用来进行条件判断的,常见的判断语句有IF、CASE、WHEN等。
IF语句用于判断一个条件是否成立,如果成立则执行一段代码,否则执行另一段代码。
其基本语法如下:IF(condition, true_value, false_value)其中,condition为判断条件,true_value为条件成立时的返回值,false_value为条件不成立时的返回值。
例如,要判断一个数是否大于10,如果是则返回“大于10”,否则返回“小于等于10”,可以使用如下语句:SELECT IF(num>10, '大于10', '小于等于10') FROMtable_name;CASE语句用于根据不同的条件返回不同的值,其基本语法如下: CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 … ELSE result END其中,expression为需要判断的值,value1、value2等为不同的条件值,result1、result2等为对应条件值的返回结果,ELSE后面的result为没有匹配到任何条件值时的返回结果。
例如,要根据一个数的值返回不同的等级,可以使用如下语句: SELECT CASE WHEN num>80 THEN '优秀' WHEN num>60 THEN '良好' WHEN num>40 THEN '及格' ELSE '不及格' END FROMtable_name;WHEN语句用于在满足某个条件时执行一段代码,其基本语法如下:WHEN condition THEN result其中,condition为判断条件,result为满足条件时的返回结果。
[转]SQLite基本语法手册SQLite是一个软件库,用于实现自包含、非服务式、零配置、事务化的SQL数据库引擎。
SQLite是一个嵌入式SQL数据库引擎,与其它大多数SQL数据库不同的是,SQLite没有独立的服务进程。
SQLite直接读写原始的磁盘文件,一个拥有多个表、索引、触发器和视图的完整SQL数据库就包含在一个独立的磁盘文件中。
一.结构定义1.CREATE TABLE:创建新表。
语法:sql-command ::=CREATE[TEMP | TEMPORARY]TABLE table-name (column-def [, column-def]*[, constraint]*)sql-command ::=CREATE[TEMP | TEMPORARY]TABLE[database-name.]table-name AS select-statem entcolumn-def ::= name [type][[CONSTRAINT name]column-constraint]*type ::= typename |typename ( number ) |typename ( number , number )column-constraint ::=NOT NULL[ conflict-clause ]|PRIMARY KEY[sort-order][ conflict-clause ]|UNIQUE[ conflict-clause ]|CHECK ( expr ) [ conflict-clause ]|DEFAULT value |COLLATE collation-nameconstraint ::=PRIMARY KEY ( column-list ) [ conflict-clause ]|UNIQUE ( column-list ) [ conflict-clause ]|CHECK ( expr ) [ conflict-clause ]conflict-clause ::=ON CONFLICT conflict-algorithm2.CREATE VIEW:创建一个视图(虚拟表),该表以另一种方式表示一个或多个表中的数据。
sqlite判断语句
SQLite是一种轻量级数据库管理系统,它支持各种数据类型和多种查询语句,其中包括判断语句。
在SQLite中,判断语句可以用于过滤、筛选和排序数据。
以下是一些常用的判断语句:
1. SELECT:用于从数据库中选择数据。
2. FROM:用于指定从哪个表中选择数据。
3. WHERE:用于过滤数据,只选择满足条件的数据。
4. AND/OR:用于连接多个条件,AND表示所有条件必须都满足,OR表示满足任一条件即可。
5. IN/NOT IN:用于指定一个值列表,只选择包含在值列表中的数据。
6. LIKE/NOT LIKE:用于根据通配符模式匹配数据。
7. ORDER BY:用于指定按照哪个字段排序数据,可以选择升序或降序。
总之,SQLite的判断语句非常灵活和强大,可以根据需求进行组合和嵌套,实现复杂的数据查询和分析。
- 1 -。
sqlite3 语句总结一、sqlite3长用于轻量级的数据存储,象单片机这一类,但是现在的sqlite3,已经很先进,不能小看二、sqlite3常用命令当前目录下建立或打开test.db数据库文件,并进入sqlite命令终端,以sqlite>前缀标识:#sqlite3 test.db查看数据库文件信息命令(注意命令前带字符'.'):sqlite>.database查看所有表的创建语句:sqlite>.schema查看指定表的创建语句:sqlite>.schema table_name以sql语句的形式列出表内容:sqlite>.dump table_name设置显示信息的分隔符:sqlite>.separator symbleExample:设置显示信息以‘:’分隔sqlite>.separator :设置显示模式:sqlite>.mode mode_nameExample:默认为list,设置为column,其他模式可通过.help查看mode相关内容sqlite>.mode column输出帮助信息:sqlite>.help设置每一列的显示宽度:sqlite>.width width_valueExample:设置宽度为2sqlite>.width 2列出当前显示格式的配置:sqlite>.show退出sqlite终端命令:sqlite>.quit或sqlite>.exit3、sqlite3指令sql的指令格式:所有sql指令都是以分号(;)结尾,两个减号(--)则表示注释。
如:sqlite>create studen_table(Stu_no interger PRIMARY KEY, Name text NOT NULL, Id int erger UNIQUE, Age interger CHECK(Age>6), School text DEFAULT 'xx小学);该语句创建一个记录学生信息的数据表。
在SQLite中创建表时,关系模型的参照完整性在create table语句中用references 命令短语指明这些外码参照哪些表的主码。
在SQLite中,false可以由数字0代替,true可以由其他的非0值代替。
在SQL查询语句中,where子句过滤行(选择),select子句过滤列(投影)。
在SQL查询语句中,select子句后的星号(*)表示所有列。
在SQL查询语句中,除必须提供select子句外,所有子句都是可选的。
在SQL查询语句中,任何select语句的输出都可以作为另一个语句的输入。
SQLite支持ANSI SQL中除right outer join和full outer join之外的所有操作,而这两个操作也可以由其他基本的关系操作完成。
在关系运算中,交运算属于附加运算,可以由基本关系运算组成。
SQLite数据库包含在单个操作系统文件中,因此在备份文件时,可以通过复制该文件完成。
在对SQLite数据库进行长期备份时,最好转储为SQL格式,这样可以实现在各种不同的SQLite版本中加以恢复,即备份为SQL格式,可以增强数据库文件的可移植性。
在SQLite中,单独的1个字段可以存储不同存储类的值,而且不同存储类的值可以通过它们各自类的“类值”进行排序。
SQLite的排序规则是:1)NULL存储类具有最低级的类值。
NULL值之间没有大小值的区分。
2)integer或real存储类值高于NULL,二者的排序级别相等。
两种类型的数据通过数值大小进行比较。
3)text存储类的值比integer和real高。
4)blob存储类是最高级别的类。
SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型。
虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。
例如:可以在Integer字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段中保存除整数以外的数据时,将会产生错误。
SQLite 在解析CREATE TABLE 语句时,会忽略CREATE TABLE 语句中跟在字段名后面的数据类型信息。
也就是说,SQLite3中的类型是一种弱类型的概念,字段类型形同虚设,存储什么数据都是可以的。
在SQLite中,创建表时主键可以使用自动增长类型,例如:id INTEGER PRIMARY KEY AUTOINCREMENT
视图是一种虚拟表,其数据来源于其他基本表或视图。
视图的数据是在使用过程中临时生成的。
SQLite的视图是只读,不可更新。
为使视图可更新,可创建负责处理视图上更新事件的触发器。
SQLite创建视图触发器时,可使用instead of 替代触发器。
触发器(Trigger)是用户定义在基本表或视图上的一类由事件驱动的特殊过程。
触发器由服务器自动激活,可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。
索引是一种用来在某种条件下加速查询的结构。
但索引会增加数据库的大小,并且可能会降低insert、update和类似操作的速度。
因为在对数据表进行增删改操作时,除了修改表,与表相关的索引也将同时被修改,势必会增加修改表的时间。
SQLite中索引采用B-tree实现。
索引是关系数据库的内部实现技术,属于内模式的范畴。
.indices foods的功能是列出foods表中的索引。
在SQLite中,索引只能在主数据库表上创建,不能在附加的数据库中的表上创建。
SQLite只能将vacuum作用于数据库,无法再精确到数据库中指定的数据表或者索引。
当某个数据库中的一个或多个数据表存在大量的插入、更新和删除等操作时,将会有大量的磁盘空间被已删除的数据所占用,在没有执行VACUUM命令之前,SQLite并没有将它们归还于操作系统。
由于该类数据表中的数据存储非常分散,因此在查询时,无法得到更好的批量IO读取效果,从而影响了查询效率。
在SQLite中,仅支持清理当前连接中的主数据库,而不能清理其它Attached数据库。
VACUUM命令在完成数据清理时,创建一个和当前数据库文件相同大小的新数据库文件,之后再将该数据库文件中的数据有组织的导入到新文件中,其中已经删除的数据块将不会被导入,在完成导入后,收缩新数据库文件的尺寸到适当的大小。
事务是一个数据库操作序列,是一个不可分割的工作单位,是并发控制的基本单位。
在关系数据库中,一个事务可以是一条或多条SQL语句,也可以包含一个或多个程序,通常一个程序会包含多个事务。
事务的ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability )
1)原子性:事务中包括的所有操作要么都做,要么都不做
2)一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态
3)隔离性:一个事务内部的操作及使用的数据对并发的其他事务是隔离的
4)持续性:事务一旦提交,对数据库的改变是永久的
事务由3 个命令控制:BEGIN、COMMIT 和ROLLBACK。
BEGIN 开始一个事务,之后的所有操作都可以取消。
COMMIT 使BEGIN 后的所有命令得到确认;
ROLLBACK 撤消BEGIN 之后的所有操作。
SQLite 默认情况下,每条SQL 语句自成事务,这是一种隐式事务,也称为自动提交模式。
条成功完成的SQL语句都自动提交,同理,每条遇到错误的语句都回滚。
冲突解决策略既可在SQL 的DML语句中指定,也可在表及索引的DDL语句中指定,即在:insert、update、create table、create index中均可指定。
SQLite中,另外的一种模式就是WAL机制,WAL(write ahead log)就是对redo日志机制的一种实现。
简单来说就是把想对数据库进行操作的动作先都写到日志里面,然后对DB 进行操作,操作完后,只把日志立即刷新到磁盘中,而不必立即将DB在内存中的数据刷新到磁盘里面,这样,相对与undo日志机制,redo机制就使得IO操作在系统的安排下进行(比如缓冲区替换等等),而不需要立即进行IO操作。
SQLite采用粗放型的锁。
当一个连接要写数据库,所有其它的连接被锁住,直到写连接结束了它的事务。
SQLite有一个加锁表,来帮助不同的写数据库都能够在最后一刻再加锁,以保证最大的并发性。
SQLite有5个不同的锁状态:未加锁(UNLOCKED)、共享(SHARED)、保留(RESERVED)、未决(PENDING)、排它(EXCLUSIVE)。
每个数据库连接在同一时刻只能处于其中一个状态。
每种状态(未加锁状态除外)都有一种锁与之对应。
SQLite数据库默认的锁状态是未加锁状态Unlocked。
为了能够从数据库中读出数据(不写),连接必须首先进入共享状态,也就是说首先要获得一个共享锁Shared。
多个连接可以同时获得并保持共享锁,也就是说多个连接可以同时从同一个数据库中读数据。
但哪怕只有一个共享锁还没有释放,就不允许任何连接写数据库。
如果一个连接想要写数据库,它必须首先获得一个保留锁Preserved。
一个数据库上同时只能有一个保留锁。
保留锁可以与共享锁共存,保留锁是写数据库的第1阶段。
保留锁即不阻止其它拥有共享锁的连接继续读数据库,也不阻止其它连接获得新的共享锁。
当数据库处于未决锁状态Pending时,想要写数据库的操作,必须等待该数据库中已经存在的共享锁释放,与此同时,新的读操作产生的共享锁申请将不再被允许。
在执行写操作之前,该进程必须先获取该数据库的排他锁Exclusive。
然而一旦拥有了排他锁,任何其它锁类型都不能与之共存。
因此,为了最大化并发效率,SQLite将会最小化排他锁被持有的时间总量。
SQLite有三种不同的事务类型,它们以不同的锁状态启动事务。
三种事务类型为:deferred、immediate或exclusive。