嵌入式 sqlite3中事务操作小结

在对 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 plain copy
  1. #include <stdio.h>  
  2. #include <sqlite3.h>  
  3. #define SQL_FILE "./sql.txt"  
  4. int commitSQL(sqlite3 *db)  
  5. {  
  6.     int ret=0;           
  7.     FILE *fp;            
  8.   
  9.     char buf[100]={0};  
  10.     char *errmsg = 0;  
  11.     char **azResult;  
  12.     int i, nRow=0, nColumn=0;  
  13.     fp = fopen(SQL_FILE, "r");  
  14.     if(NULL == fp)       
  15.         return -1;       
  16.     ret = sqlite3_exec(db,"BEGIN EXCLUSIVE", NULL,NULL, &errmsg);      
  17.     if(ret != SQLITE_OK)  
  18.     {  
  19.         printf("ret = %d, BEGIN EXCLUSIVE: %s", ret, errmsg);  
  20.     }  
  21.     while( NULL != fgets(buf,100, fp))  
  22.     {                         
  23.         printf("%s\n", buf);  
  24.         if(0 == strncmp(buf,"select", 6))  
  25.         {  
  26.             ret += sqlite3_get_table(db, buf, &azResult, &nRow, &nColumn,&errmsg);  
  27.             if(ret != SQLITE_OK)  
  28.             {  
  29.                 printf("ret = %d, search table fail: %s\n", ret, errmsg);  
  30.             }  
  31.             printf("row:%d column=%d\n",nRow, nColumn);  
  32.             for(i=nColumn;i<(nRow+1)*nColumn;i++)  
  33.             {  
  34.                 printf("azResult[%d] = %s\n", i, azResult[i]);  
  35.             }  
  36.             sqlite3_free_table(azResult);  
  37.         }  
  38.         else  
  39.             ret += sqlite3_exec(db, buf, 0, 0, &errmsg);   
  40.         if(SQLITE_OK != ret)  
  41.         {  
  42.             printf("ret = %d, sql: %s\n", ret, errmsg);  
  43.             break;  
  44.         }  
  45.     }        
  46.     if(ret == SQLITE_OK)  
  47.     {  
  48.         ret=sqlite3_exec(db,"COMMIT", NULL,NULL, &errmsg);  
  49.         if(ret != SQLITE_OK)  
  50.         {  
  51.             printf("ret = %d, COMMIT: %s\n", ret, errmsg);  
  52.         }  
  53.     }  
  54.     else  
  55.     {  
  56.         ret=sqlite3_exec(db,"ROLLBACK", NULL,NULL, &errmsg);  
  57.         if(ret != SQLITE_OK)  
  58.         {  
  59.             printf("ret = %d, ROLLBACK: %s\n", ret, errmsg);  
  60.         }  
  61.         sqlite3_free(errmsg);  
  62.         fclose(fp);   
  63.         return -2;  
  64.     }  
  65.     sqlite3_free(errmsg);  
  66.     fclose(fp);   
  67.   
  68.     return ret;  
  69. }  
  70.   
  71. int main()  
  72. {  
  73.     sqlite3 *db;  
  74.     char *dbPath="test.db";    
  75.     int ret = 0;          
  76.     ret = sqlite3_open(dbPath, &db);    
  77.     if(ret == SQLITE_OK)  
  78.     {    
  79.         printf("open succeed\n");        
  80.     }    
  81.     else  
  82.     {                
  83.         printf("open fail\n");           
  84.     }    
  85.     ret = commitSQL(db);  
  86.     printf("ret = %d\n", ret);  
  87.   
  88.     sqlite3_close(db);  
  89. }  


你可能感兴趣的:(嵌入式 sqlite3中事务操作小结)