zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    程序员常用英语词汇
    声明式编程与命令式编程
    vue 常用ui组件库
    Vue 组件之间传值
    vscode插件之背景插件(background)
    iconfont的使用
    CSS3 @font-face 规则
    CSS抗锯齿 font-smoothing 属性介绍
    new Image 读取宽高为0——onload
    js的for循环中出现异步函数,回调引用的循环值始终是最后的值
  • 原文地址:https://www.cnblogs.com/anjsxz/p/3761943.html
Copyright © 2011-2022 走看看