关于sqlite3的事务控制问题
逐日狂魔
逐日狂魔 2017-10-20 16:25:54
0
1
972

在封装对sqlite3数据库进行操作的方法时,测试代码如下:

$path = 'test.db';

$conn = new sqlite3($path);

$sql = 'insert into tb_test...';

for($i=0;$i<10000,$i++){

    $conn->query($sql);

}

由于想添加事务的控制,但是找来找去都没有找到关于sqlite3这样的方式,如何添加事务,都是用的new pdo()。本人之前一直写java的,php目前还不熟悉,希望各位码友能回答一下,谢谢啦。

逐日狂魔
逐日狂魔

全部回复(1)
ringa_lee
//sqlite3 事务的操作没有特别的接口函数,就是一个普通的 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 ),导致总控程序的全局变量被修改。

具体还需进一步研究。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!