数据库在执行多条操作时就会显得速度很慢,为了提升速度可以使用数据库的事务操作来提升速度
一、事务介绍
事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作
完成,也可以是由某种数据库程序自动完成。
例如:在一张表中插入一条数据,删除数据,修改数据,查找数据,都是在执行事务。实际上可以把一些相同操作的事务归并在一起,最后
一起提交就可以变成一个事务,大大提高了数据库执行的效率。
1.事务操作分类
1."begin transaction" // 开始一个事务
2."commit transaction"// 提交事务
3."rollback transaction"//事务回滚,重新执行未提交的事务
2.在执行多次sql操作时可以以下面模板去使用事务
char *err_msg;
int ret;
ret=sqlite3_exec(db,"begin;",0,0,&err_msg);//开始一个事务
for(){
if(出错){
sqlite3_exec ( db , "rollback transaction", 0 , 0 ,&exec_err);//事务回滚
}
}
sqlite3_finalize(stmt);
sqlite3_exec(db,"commit;",0,0,&exec_err);//提交事务
3.demon验证
1>下面demon使用事务插入1000条信息到表中,用时14毫秒
void sql_class_insert(int age,const char *name,const char *sex)
{
int res, err = -1;
char *exec_err;
sqlite3_stmt *stmt;
//1.执行sql select语句
res = sqlite3_prepare_v2(db, INSERT_class, -1, &stmt, NULL);
if (SQLITE_OK != res) {
goto out;
}
int i;
sqlite3_exec(db,"begin;",0,0,0);
struct timeval start_time;
struct timeval stop_time;
gettimeofday(&start_time, NULL);
for(i=0;i<1000;i++){
sqlite3_reset(stmt);
//2.绑定数据 int类型
res = sqlite3_bind_int(stmt, 1, age);
if (res != SQLITE_OK)
{
err = -1;
}
//2.绑定数据 字符型
//SQLITE_STATIC->传递给该字符串的指针将有效,直到执行查询为止
res = sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC);
if (res != SQLITE_OK)
{
err = -1;
}
res = sqlite3_bind_text(stmt, 3, sex, -1, SQLITE_STATIC);
if (res != SQLITE_OK)
{
err = -1;
}
//3.遍历select执行的返回结果
res = sqlite3_step(stmt);
if (SQLITE_DONE == res) {
err = 0;
}
if(err==-1)
{
sqlite3_exec ( db , "rollback transaction", 0 , 0 ,&exec_err);
}
}
//4.销毁前面被sqlite3_prepare创建的准备语句
//【每个准备语句都必须使用这个函数去销毁以防止内存泄露】
sqlite3_finalize(stmt);
sqlite3_exec(db,"commit;",0,0,0);
gettimeofday(&stop_time, NULL);
printf("pay time is %ld毫秒\n",(stop_time.tv_sec * 1000 + stop_time.tv_usec / 1000)
- (start_time.tv_sec * 1000 + start_time.tv_usec / 1000));
out:
if (err < 0) {
printf("%s\n", sqlite3_errmsg(db));
printf( "res = %d\n", res);
}
}
2>j接下来屏蔽掉事务操作
对比发现屏蔽掉事务后插入速度明显下降
数据库
完整demon,可以编译运行
下载地址