您的位置:首页 > 数据库

嵌入式 sqlite3中事务操作小结

2014-09-17 17:32 169 查看
在对 sqlite3 insert into 等操作时速度比较慢。
原因:它以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的操作,就很慢。
解决办法:用事物的形式提交,因为开始事务后,进行的大量操作语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。
接口:事务的操作没有特别的接口函数,就是一个普通的 sql 语句而已,分别如下:

int ret ;

ret = sqlite3_exec ( db , "begin
transaction" , 0 , 0 , & zErrorMsg ); // 开始一个事务

ret = sqlite3_exec ( db , "commit
transaction" , 0 , 0 , & zErrorMsg ); // 提交事务

ret = sqlite3_exec ( db , "rollback
transaction" , 0 , 0 , & zErrorMsg );
例程:在进行大量的操作前使用如下语句

ret = sqlite3_exec ( db , "begin
transaction" , 0 , 0 ,& zErrorMsg );

for (...)

{

//insert into operate

// 如果操作错误

ret = sqlite3_exec ( db , "rollback
transaction" , 0 , 0 , & zErrorMsg )

}

ret = sqlite3_exec ( db , "commit
transaction" , 0 , 0 , & zErrorMsg );

代码功能:

从sql.txt中读出SQL语句,并一一执行,若有一条执行失败,则所有执行全部不生效。回滚到执行前的状态。

[cpp] view
plaincopy





#include <stdio.h>

#include <sqlite3.h>

#define SQL_FILE "./sql.txt"

int commitSQL(sqlite3 *db)

{

int ret=0;

FILE *fp;

char buf[100]={0};

char *errmsg = 0;

char **azResult;

int i, nRow=0, nColumn=0;

fp = fopen(SQL_FILE, "r");

if(NULL == fp)

return -1;

ret = sqlite3_exec(db,"BEGIN EXCLUSIVE", NULL,NULL, &errmsg);

if(ret != SQLITE_OK)

{

printf("ret = %d, BEGIN EXCLUSIVE: %s", ret, errmsg);

}

while( NULL != fgets(buf,100, fp))

{

printf("%s\n", buf);

if(0 == strncmp(buf,"select", 6))

{

ret += sqlite3_get_table(db, buf, &azResult, &nRow, &nColumn,&errmsg);

if(ret != SQLITE_OK)

{

printf("ret = %d, search table fail: %s\n", ret, errmsg);

}

printf("row:%d column=%d\n",nRow, nColumn);

for(i=nColumn;i<(nRow+1)*nColumn;i++)

{

printf("azResult[%d] = %s\n", i, azResult[i]);

}

sqlite3_free_table(azResult);

}

else

ret += sqlite3_exec(db, buf, 0, 0, &errmsg);

if(SQLITE_OK != ret)

{

printf("ret = %d, sql: %s\n", ret, errmsg);

break;

}

}

if(ret == SQLITE_OK)

{

ret=sqlite3_exec(db,"COMMIT", NULL,NULL, &errmsg);

if(ret != SQLITE_OK)

{

printf("ret = %d, COMMIT: %s\n", ret, errmsg);

}

}

else

{

ret=sqlite3_exec(db,"ROLLBACK", NULL,NULL, &errmsg);

if(ret != SQLITE_OK)

{

printf("ret = %d, ROLLBACK: %s\n", ret, errmsg);

}

sqlite3_free(errmsg);

fclose(fp);

return -2;

}

sqlite3_free(errmsg);

fclose(fp);

return ret;

}

int main()

{

sqlite3 *db;

char *dbPath="test.db";

int ret = 0;

ret = sqlite3_open(dbPath, &db);

if(ret == SQLITE_OK)

{

printf("open succeed\n");

}

else

{

printf("open fail\n");

}

ret = commitSQL(db);

printf("ret = %d\n", ret);

sqlite3_close(db);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: