sqlite3使用事务处理

sqlite3使用事务处理[zz]

标签:  sqlite 数据库 insert 测试 磁盘 sql
2010-09-24 12:10  10890人阅读  评论(1)  收藏  举报
 分类:
Database(3) 

在对 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 );

 

开发过程遇到这样的问题:

分别对两个数据库文件的不同表进行操作,执行顺序为: open db A->begin trasaction->open db B->select from db B->close db B->select from db A->rollbak or commit->close db A

测试发现, select from db B 这一步会出错,错误信息为library routine called out of sequence ,出错后执行rollback ,这一步也会报错。

原来以为原因是:开始一个事务只能对一个数据库进行操作。

测试发现,即使不开始事务,执行顺序为: open db A->open db B->select from db B->close db B->select from db A->close db A , 仍会出现ibrary routine called out of sequence 的错误。

难道打开一个数据库,在关闭其之前不能打开其他数据库?

难道sqlite 的并发执行需要用户自己来控制?

 

今天发现,以上出错原因可能是总控程序和子程序的全局变量一致(都是sqlite3 *db ),导致总控程序的全局变量被修改。

具体还需进一步研究。

 

你可能感兴趣的:(oracle开发SQL语句,其他数据库)