sqlite数据库之事务处理

本篇文章旨在探讨sqlite数据库的事务处理。

关于sqlite,我封装了几个类方法方便调用sqlite,课参考我的开源项目,欢迎广大网友加入项目中一起优化这个项目!

好了接下来先贴上测试程序代码:

#include <cstring>
#include "./Wtime.h"
#include <sys/time.h>
#include <unistd.h>

#include "./main.hpp"

typedef struct {
	bool	output;
	bool	timing;
} dbCfg_t;

int test_exec(int argc, char* argv[])
{
	class sql::sqlite* handle;
 	struct timeval start,end;
	dbCfg_t cfg;
	std::string sqlCmd;
	if (argc>2) {
		handle = new sql::sqlite(argv[2]);
		if (handle == nullptr) {
			std::cout << "数据库[" << argv[2] << "]打开失败!" << std::endl;
			return -1;
		}
	} else {
		std::cout << "参数错误:输入正确的参数,如:./app 6 database.db" << std::endl;
		return -1;
	}
	//memset (&cfg, 0, sizeof (TdbCfg));
	cfg.timing = true;
	cfg.output = true;
	while (1) {
		std::cout << ">";
		//std::cin >> sqlCmd;
		std::getline (std::cin, sqlCmd);
		if (sqlCmd == "help") {
			std::cout << "[帮助]" << std::endl;
			std::cout << "output disable:关闭查询输出" << std::endl;
			std::cout << "output enable:打开查询输出" << std::endl;
			std::cout << "timing disable:关闭计时器" << std::endl;
			std::cout << "timing enable:打开计数器" << std::endl;
			std::cout << "exit:退出" << std::endl;
		} else if (sqlCmd == "output disable") {
			cfg.output = false;
		} else if (sqlCmd == "output enable") {
			cfg.output = true;
		} else if (sqlCmd == "timing disable") {
			cfg.timing = false;
		} else if (sqlCmd == "timing enable") {
			cfg.timing = true;
		} else if (sqlCmd == "exit") {
			delete handle;
			return 0;
		} else {
			gettimeofday (&start, NULL);
			cfg.output?handle->exec (sqlCmd.c_str(), test_callback):handle->exec (sqlCmd.c_str());
			//sleep (1);
			gettimeofday (&end, NULL);
			if (cfg.timing) {
				std::cout << "耗时:" << (end.tv_sec-start.tv_sec)*1000 + (end.tv_usec-start.tv_usec)/1000 << " ms,";
				std::cout << (end.tv_usec-start.tv_usec)%1000 << " us" << std::endl;
			}
		}
		sqlCmd.clear ();
	}
}

首先创建表和插入两条记录
在这里插入图片描述然后开启事务,插入一条记录后执行回滚操作
在这里插入图片描述如图中效果所示,回滚之后插入的数据没有了。现在来试试插入数据后提交。

在这里插入图片描述如图中所示,插入的数据保存在了数据库中。接下来测试一下未提交时的查询。
在这里插入图片描述在这里插入图片描述执行回滚后记录被撤回了。

现在来试试多进程间的事务处理关系。
在这里插入图片描述左边窗口执行事务,在开启事务后插入了一条数据,但是还没有提交或回滚,此时在右边窗口执行查询操作,结果查不到刚刚插入的数据,说明事务是线程互斥的。
在这里插入图片描述在这里插入图片描述在一个进程开启事务后,另一个进程插入记录会报错,显示数据库被锁住了。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值