参考文档 http://www.sqlite.org/sharedcache.html

sqlite3实现脏读需要进行如下配置:

(A) 打开共享cache, 调用sqlite3接口sqlite3_enable_shared_cache(1)。

(B) 执行语句"PRAGMA read_uncommitted = TRUE"。

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <cassert>
#include <thread>#include "sqlite3.h"static const char* kDatabaseName = "test.db";static bool OpenDB(const char* path, sqlite3** db) {assert(db != NULL);sqlite3_enable_shared_cache(1);int rc = sqlite3_open(path, db);if (rc != SQLITE_OK) {std::cout << "Failed to open " << kDatabaseName << std::endl;std::cout << "Error msg: " << sqlite3_errmsg(*db) << std::endl;return false;}sqlite3_exec(*db, "PRAGMA read_uncommitted = TRUE", NULL, NULL, NULL);return true;
}static void PrepareTable() {sqlite3* db = NULL;if (!OpenDB(kDatabaseName, &db)) {return;}const char* kCreateTableSql = "CREATE TABLE DIRTYREAD_TEST(ID INT);";char* error_msg = NULL;int rc = sqlite3_exec(db, kCreateTableSql, NULL, NULL, &error_msg);if (rc != SQLITE_OK) {std::cout << "Failed to create table!" << std::endl;std::cout << "Error msg: " << error_msg << std::endl;sqlite3_free(error_msg);}sqlite3_close(db);
}static void ClearTable() {sqlite3* db = NULL;if (!OpenDB(kDatabaseName, &db)) {return;}const char* kClearTableSql = "DELETE FROM DIRTYREAD_TEST;";char* error_msg = NULL;int rc = sqlite3_exec(db, kClearTableSql, NULL, NULL, &error_msg);if (rc != SQLITE_OK) {std::cout << "Failed to clear table!" << std::endl;std::cout << "Error msg: " << error_msg << std::endl;sqlite3_free(error_msg);}sqlite3_close(db);
}static void InsertData() {sqlite3* db = NULL;if (!OpenDB(kDatabaseName, &db)) {return;}const char* kInsertDataSql = "INSERT INTO DIRTYREAD_TEST VALUES(?);";sqlite3_exec(db, "begin", NULL, NULL, NULL);sqlite3_stmt* stmt = NULL;sqlite3_prepare_v2(db, kInsertDataSql, strlen(kInsertDataSql), &stmt, NULL);for (int i = 0; i < 10000000; i++) {sqlite3_reset(stmt);sqlite3_bind_int(stmt, 1, i);int rc = sqlite3_step(stmt);if (rc != SQLITE_DONE) {std::cout << "Failed to execute sql when insert " << i << "!" << std::endl;std::cout << "Error code: " << sqlite3_errcode(db) << std::endl;std::cout << "Error msg: " << sqlite3_errmsg(db) << std::endl;break;}}sqlite3_finalize(stmt);sqlite3_exec(db, "commit", NULL, NULL, NULL);sqlite3_close(db);
}static int SelectCallback(void* data, int col_count, char** col_values, char** col_names) {for (int i = 0; i < col_count; ++i) {if (col_values[i] == NULL) {continue;}std::cout << col_names[i] << " = " << col_values[i] << std::endl;}return 0;
}static void ReadData() {sqlite3* db = NULL;if (!OpenDB(kDatabaseName, &db)) {return;}const char* kSelectSql = "SELECT * FROM DIRTYREAD_TEST WHERE ID = 1;";char* error_msg = NULL;for (int i = 0; i < 1000; i++) {int rc = sqlite3_exec(db, kSelectSql, SelectCallback, NULL, &error_msg);if (rc == SQLITE_OK) {std::cout << "Select successfully!" << std::endl;} else {std::cout << "Select failed! Error msg: " << error_msg << std::endl;sqlite3_free(error_msg);}}sqlite3_close(db);
}int main4() {//PrepareTable();ClearTable();std::thread thread1(InsertData);std::thread thread2(ReadData);thread1.join();thread2.join();return 0;
}

Sqlite3实现脏读相关推荐

  1. 如何在sqlite3连接中创建并调用自定义函数

    #!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sql ...

  2. Sqlite3支持的数据类型 日期函数 Sqlite3 函数

    Sqlite3支持的数据类型 NULL INTEGER REAL TEXT BLOB 但实际上,sqlite3也接受如下的数据类型: smallint 16 位元的整数. interger 32 位元 ...

  3. linux qt 连接sqlite3,RedHat 9 Linux下在QT3.1中连接SQLite3全过程详细记录

    作者:zieckey([email]zieckey@yahoo.com.cn[/email]) All Rights Reserved 下文介绍的内容都是基于 Linux RedHat 9.0 平台的 ...

  4. mysql 事务隔离规范_MySQL事务隔离级别以及脏读、幻读、不可重复读示例

    事务的隔离性 MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session).每个客户端都可以在自己的 ...

  5. 在CentOS 7.5上升级SQLite3过程实录

    业务起因 我在CentOS 7.5上安装python3.7+Django 3.1.7并创建项目时,发现启动demo例子出错了,出错信息如下: django.core.exceptions.Improp ...

  6. SQLite3简单C++包装类源码示例

    一个比较好的SQLite3 C++ wrapper包装类的通常思路是这样的: 数据库连接类,包含连接池,和sqlite3*,负责与数据库文件的连接问题: 一些create table,insert,u ...

  7. 【数据库】sqlite3数据库备份、导出方法汇总

    [数据库]sqlite3常用命令及SQL语句 目录 1.直接拷贝数据库 2.使用.backup .clone 1)交互式 2)脚本 3.导出到csv文件中(其它格式类似) 1)交互式 2)脚本 3)导 ...

  8. 【数据库】sqlite3常用命令及SQL语句

    [数据库]sqlite3数据库备份.导出方法汇总 一.准备工作 0.安装SQLite3 1)ubuntu命令安装(不是最新版本) sudo apt install sqlite3 2)源码安装(可以安 ...

  9. 【iOS】sqlite3的使用(増删改查)

    目录: 一.sqlite3常用函数 二.将sqlite3集成到项目,实现増删改查 三.封装DBManager 四.Demo 一.sqlite3常用函数及解释 (1)sqlite3_open: 用来创建 ...

  10. sqlite3数据的使用(xcode 7,ios9)

    由于考虑将来还要开发Android版本app,为了移植方便,所以使用了sqlite3来做数据持久化,到时候把sql语句拷过去还能用. 1. 首先用xcode载入sqlite3类库 选择工程的TARGE ...

最新文章

  1. oracle独立事务,Oracle中独立事务的处理
  2. java静态变量实例变量_java中静态变量和实例变量的区别
  3. Access日期、时间函数
  4. 标志位操作指令七条CLC,STC,CLD,STD,CLI,STI,CMC
  5. 整人电脑BAT小程序源码大全
  6. 广数系统u盘支持什么格式_数控车床编程导入u盘 数控车床u盘读不出来
  7. 微信小程序弹窗有输入框且可以使用名文和密文输入
  8. MVC 生成PDf表格并插入图片
  9. 计算机在教育中的应用的基本现状,现代教育技术应用的现状与发展
  10. ABP VNext学习日记22
  11. 利用Python爬虫获取招聘网站职位信息
  12. 【自然语言处理基础技能(NLP)】jieba中文文本处理
  13. 26.空寂无求,禅意悠远
  14. 视频教程-实用通俗易懂的设计模式-软件设计
  15. Git入门教程之注册(一)
  16. 阿里、京东、苏宁双十一“链”战
  17. 锐捷(五)交换机简单网络管理协议(SNMP)的配置
  18. android nfc框架分析,Android NFC架构分析
  19. 微信公众号如何上传PPT文件【教程】
  20. prim算法_数据结构与算法

热门文章

  1. AXIS的Calculater 测试
  2. 运行npm install 出现thon Python is not set from command line or npm configuration解决方案
  3. 等保2.0四级安全要求
  4. 网页打印服务器无法创建对象,打印问题,小编教你怎么解决automation服务器不能创建对象...
  5. CSS的border属性绘制简单三角形、边框三角形
  6. python怎么激活_Python窗口激活
  7. [数学] 一般正态曲线函数的积分怎么求?为什么总是1?
  8. windows 实现 linux soft link,Linux中的软链接(Soft Link)和硬链接(Hard Link)的区别...
  9. 学习笔记(15):程序员的数学:微积分-常用导数(二):最常用到的技巧
  10. 能搬砖的游戏有哪些,有哪些比较适合新手去做?