欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

sqlite2.8.17 database is locked!该如何解决

更新时间: 2014-01-05 02:31:50 责任编辑: Author_N1

 

SQLITE2.8.17 database is locked!
进程运行时,时常出现 database is locked 错误,查询官网文档,说的是由于递归调用sqlite_exec()函数引起的,未能明白怎么会出现这种情况。
进程有两个线程访问数据库,在访问的接口处加上了互斥量,代码如下:

        pthread_mutex_lock (&query_mutex);
int retv = sqlite2_query(conn, sql); //对sqlite_exec()的封装,统一到mysql的C语言API形式
if(0 != retv)
{
PRINT(SRC,LEVEL,"ERROR: %s, when %s!!!\n",DB_ERROR(conn),sql);
DB_FREEERR(conn);     //释放错误字符串
retv = ERR_DB_QUERY;
sleep(1);             //sleep(1) to slow down closely followed database calls
}
pthread_mutex_unlock (&query_mutex);

sqlite2_query()使用了封装好的api,没有使用prepare(),step()等函数,如下:
int sqlite2_query(SQLITE2_CONN *conn,const char *sql)
{//error: non-zero, success: zero
if(0 <= IsSQLType(sql,"select")) //SELECT SQL statement
{ return sqlite_get_table(conn->connection, sql,
&conn->result.data,&conn->result.nrow,
&conn->result.ncolumn,&conn->errmsg);
}
else //other SQL statements
{ return sqlite_exec(conn->connection,sql,0,0,&conn->errmsg);
}
}

想向各位请教,如此调用是否会产生递归调用sqlite_exec()等函数,从而导致database is locked ,按官网说法,是递归引起的,而不是并发引起的。
或者是不是在pthread_mutex_unlock()函数之后,另外一个线程的sqlite的回调函数还在发生,所以导致这种情况?或者?
严重时,进程就出现了 segmentation fault 错误,就终止了,还请大家指教。
--参考方法--
改为一个进程读写试试。
--参考方法--
conn->connection, 这个不应该共享。应该两个线程都用自己的句柄,否则你的问题很难解决。
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:31:50
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/10982/
本文WWW.DOC100.NET DOC100.NET版权所有。