Sqlite3实现脏读
参考文档 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实现脏读相关推荐
- 如何在sqlite3连接中创建并调用自定义函数
#!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sql ...
- Sqlite3支持的数据类型 日期函数 Sqlite3 函数
Sqlite3支持的数据类型 NULL INTEGER REAL TEXT BLOB 但实际上,sqlite3也接受如下的数据类型: smallint 16 位元的整数. interger 32 位元 ...
- linux qt 连接sqlite3,RedHat 9 Linux下在QT3.1中连接SQLite3全过程详细记录
作者:zieckey([email]zieckey@yahoo.com.cn[/email]) All Rights Reserved 下文介绍的内容都是基于 Linux RedHat 9.0 平台的 ...
- mysql 事务隔离规范_MySQL事务隔离级别以及脏读、幻读、不可重复读示例
事务的隔离性 MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session).每个客户端都可以在自己的 ...
- 在CentOS 7.5上升级SQLite3过程实录
业务起因 我在CentOS 7.5上安装python3.7+Django 3.1.7并创建项目时,发现启动demo例子出错了,出错信息如下: django.core.exceptions.Improp ...
- SQLite3简单C++包装类源码示例
一个比较好的SQLite3 C++ wrapper包装类的通常思路是这样的: 数据库连接类,包含连接池,和sqlite3*,负责与数据库文件的连接问题: 一些create table,insert,u ...
- 【数据库】sqlite3数据库备份、导出方法汇总
[数据库]sqlite3常用命令及SQL语句 目录 1.直接拷贝数据库 2.使用.backup .clone 1)交互式 2)脚本 3.导出到csv文件中(其它格式类似) 1)交互式 2)脚本 3)导 ...
- 【数据库】sqlite3常用命令及SQL语句
[数据库]sqlite3数据库备份.导出方法汇总 一.准备工作 0.安装SQLite3 1)ubuntu命令安装(不是最新版本) sudo apt install sqlite3 2)源码安装(可以安 ...
- 【iOS】sqlite3的使用(増删改查)
目录: 一.sqlite3常用函数 二.将sqlite3集成到项目,实现増删改查 三.封装DBManager 四.Demo 一.sqlite3常用函数及解释 (1)sqlite3_open: 用来创建 ...
- sqlite3数据的使用(xcode 7,ios9)
由于考虑将来还要开发Android版本app,为了移植方便,所以使用了sqlite3来做数据持久化,到时候把sql语句拷过去还能用. 1. 首先用xcode载入sqlite3类库 选择工程的TARGE ...
最新文章
- oracle独立事务,Oracle中独立事务的处理
- java静态变量实例变量_java中静态变量和实例变量的区别
- Access日期、时间函数
- 标志位操作指令七条CLC,STC,CLD,STD,CLI,STI,CMC
- 整人电脑BAT小程序源码大全
- 广数系统u盘支持什么格式_数控车床编程导入u盘 数控车床u盘读不出来
- 微信小程序弹窗有输入框且可以使用名文和密文输入
- MVC 生成PDf表格并插入图片
- 计算机在教育中的应用的基本现状,现代教育技术应用的现状与发展
- ABP VNext学习日记22
- 利用Python爬虫获取招聘网站职位信息
- 【自然语言处理基础技能(NLP)】jieba中文文本处理
- 26.空寂无求,禅意悠远
- 视频教程-实用通俗易懂的设计模式-软件设计
- Git入门教程之注册(一)
- 阿里、京东、苏宁双十一“链”战
- 锐捷(五)交换机简单网络管理协议(SNMP)的配置
- android nfc框架分析,Android NFC架构分析
- 微信公众号如何上传PPT文件【教程】
- prim算法_数据结构与算法
热门文章
- AXIS的Calculater 测试
- 运行npm install 出现thon Python is not set from command line or npm configuration解决方案
- 等保2.0四级安全要求
- 网页打印服务器无法创建对象,打印问题,小编教你怎么解决automation服务器不能创建对象...
- CSS的border属性绘制简单三角形、边框三角形
- python怎么激活_Python窗口激活
- [数学] 一般正态曲线函数的积分怎么求?为什么总是1?
- windows 实现 linux soft link,Linux中的软链接(Soft Link)和硬链接(Hard Link)的区别...
- 学习笔记(15):程序员的数学:微积分-常用导数(二):最常用到的技巧
- 能搬砖的游戏有哪些,有哪些比较适合新手去做?