sqlite3使用事务处理

sqlite3使用事务处理,第1张

概述sqlite3使用事务处理[zz] 标签:  sqlite 数据库 insert 测试 磁盘 sql 2010-09-24 12:10  10890人阅读  评论(1)  收藏  举报  分类: Database(3)  <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso sqlite3使用事务处理[zz] 标签: sqlite 数据库 insert 测试 磁盘 sql 2010-09-24 12:10 10890人阅读 评论(1) 收藏 举报 分类:

<!-- /* Font DeFinitions */ @Font-face {Font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-Font-alt:Simsun; mso-Font-charset:134; mso-generic-Font-family:auto; mso-Font-pitch:variable; mso-Font-signature:3 135135232 16 0 262145 0;} @Font-face {Font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-Font-charset:0; mso-generic-Font-family:swiss; mso-Font-pitch:variable; mso-Font-signature:536871559 0 0 0 415 0;} @Font-face {Font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-Font-charset:134; mso-generic-Font-family:auto; mso-Font-pitch:variable; mso-Font-signature:3 135135232 16 0 262145 0;} /* Style DeFinitions */ p.Msonormal,li.Msonormal,div.Msonormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-IDeograph; mso-pagination:none; Font-size:10.5pt; mso-bIDi-Font-size:12.0pt; Font-family:"Times New Roman"; mso-fareast-Font-family:宋体; mso-Font-kerning:1.0pt;} /* Page DeFinitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grID:15.6pt;} div.Section1 {page:Section1;} -->

在对sqlite3 insert into等 *** 作时速度比较慢。

原因:它以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的 *** 作,就很慢。

解决办法:用事物的形式提交,因为开始事务后,进行的大量 *** 作语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果 *** 作错误,还可以回滚事务。

接口:事务的 *** 作没有特别的接口函数,就是一个普通的SQL语句而已,分别如下:

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

ret"commit transaction"提交事务"rollback transaction");


例程:在进行大量的 *** 作前使用如下语句

ret);
for(...)
{
//insert into operate


如果 *** 作错误)
}
ret);

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

分别对两个数据库文件的不同表进行 *** 作,执行顺序为: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),导致总控程序的全局变量被修改。

具体还需进一步研究。

总结

以上是内存溢出为你收集整理的sqlite3使用事务处理全部内容,希望文章能够帮你解决sqlite3使用事务处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1168543.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存