sqlite
SQLite 支持三种线程模式:
1. 单线程模式
这种模式下,没有进行互斥,多线程使用不安全
2. 多线程模式
这种模式下,在多线程中使用单个数据库连接是不安全的,否则就是安全的。(译注:即不能在多个线程中共享数据库连接)
3. 串行模式
这种模式下,sqlite是线程安全的。(译注:即使在多个线程中不加互斥的使用同一个数据库连接)
线程模式可以在编译时(通过源码编译sqlite库时)、启动时(使用sqlite的应用程序初始化时)或者运行时(创建数据库连接时)来指定。一般而言,运行时指定的模式将覆盖启动时的指定模式,启动时指定的模式将覆盖编译时指定的模式。但是,单线程模式一旦被指定,将无法被覆盖。
默认的线程模式是串行模式。
编译时选择线程模式
可以通过定义SQLITE_THREADSAFE宏来指定线程模式。如果没有指定,默认为串行模式。定义宏SQLITE_THREADSAFE=1指定使用串行模式;=0使用单线程模式;=2使用多线程模式。
sqlite3_threadsafe()函数的返回值可以确定编译时指定的线程模式。如果指定了单线程模式,函数返回false。如果指定了串行或者多线程模式,函数返回true。由于sqlite3_threadsafe()函数要早于多线程模式以及启动时和运行时的模式选择,所以它既不能区别多线程模式和串行模式也不能区别启动时和运行时的模式。
译注:最后一句可通过sqlite3_threadsafe函数的实现来理解
SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }
如果编译时指定了单线程模式,那么临界互斥逻辑在构造时就被省略,因此也就无法在启动时或运行时指定串行模式或多线程模式。
启动时选择线程模式
假如在编译时没有指定单线程模式,就可以在应用程序初始化时使用sqlite3_config()函数修改线程模式。参数SQLITE_CONFIG_SINGLETHREAD可指定为单线程模式,SQLITE_CONFIG_MULTITHREAD指定为多线程模式,SQLITE_CONFIG_SERIALIZED指定为串行模式。
运行时选择线程模式
如果没有在编译时和启动时指定为单线程模式,那么每个数据库连接在创建时可单独的被指定为多线程模式或者串行模式,但是不能指定为单线程模式。如果在编译时或启动时指定为单线程模式,就无法在创建连接时指定多线程或者串行模式。
创建连接时用sqlite3_open_v2()函数的第三个参数来指定线程模式。SQLITE_OPEN_NOMUTEX标识创建多线程模式的连接;SQLITE_OPEN_FULLMUTEX标识创建串行模式的连接。如果没有指定标识,或者使用sqlite3_open()或sqlite3_open16()函数来创建数据库连接,那么在编译时或启动时指定的线程模式将作为默认的线程模式使用。
=========
sqlite> .mode column
sqlite> .headers on
create table test (id interger primary key, value text);
select last_insert_rowid();
create index test_idx on test (value);
create view schema as select * from sqlite_master;
.exit
.tables
.indices test
.schema test
select type,name,tbl_name ,sql from sqlite_master order by type;
.output file.sql //设置输出
.dump //输出
.out stdout //回复输出到标准
.show //显示shell中定义的所有设置
.read file.sql //执行file.sql
.import file.csv //接入有含有分隔符的文件
.output file.csv
.separator ,
sqlite3 test.db .dump >test.sql 备份
sqlite3 test2.db<test.sql 回复
sqlite3 -init test.sql test3.db
==================
格式化:
.echo 回显输入的命令
.headers on 查询时显示字段名
.nullvalue NULL 显示空值
.prompt ‘sqlite3>'
.mode csv/column/html/insert/line/list/tabs/tcl
.output text.csv
.separator ,
select * from test ;
.output stdout
create table test2(id integer primary key,value text);
.import test.csv test2
================
create table episodes(
id integer primary key,
season int,
name text);
create table foods(
id integer primary key,
type_id integer,
name text);
create food_types(
id integer primary key,
name text);
create table foods_episodes(
food_id integer,
episode_id integer);
================
create table foods as select * from foods; 从一个表创建表
数据库锁
unlocked,shared,reserved(要写先要有预留锁),pending(其它连接不能在获的新的共享锁了,已有连接完成释放共享锁进入一个排它锁),exclusive(提交时)
事务类型
begin [deferred/ immediate / exclusive ] transaction; 起动事务(后两种)同时获的锁,可以防止死锁
================
reindex 重建索引
vacuum 重构数据库文件清理那些未使用的空间
================
数据库配置
pragma cache_size;
pragma database_list;
pragma index_list;
pragma table_info;
pragma index_info;
select * from sqlite_master;
explain query plan select * from foods where id=145;