sqlite3数据库是一个数据库一个文件,所以当多进程访问操作同一数据库时,即与操作同一文件一样,文件锁问题。
对同个数据库进行多进程同时读是允许的,但多进程同时写是不允许的,如果一个进程已经正在写,其他进程就会写失败。sqlite3返回信息就是"Database is locked",错误码SQLITE_BUSY。
1、解决方法一
官方网站对这个问题是这个说的:
When SQLite tries to access a file that is locked by another process, the default behavior is to return SQLITE_BUSY. You can adjust this behavior from C code using the sqlite3_busy_handler() or sqlite3_busy_timeout() API functions.
建议用sqlite3_busy_handler()或sqlite3_busy_timeout()在执行业务代码中加入相应的行为。
int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
int sqlite3_busy_timeout(sqlite3*, int ms);
两个函数只能用一个,用了一个,另一个就失效了。
2、解决方法二
加上一个循环判断。
while( 1 )
{
if( SQLITE_OK != sqlite3_exec( myconn, sql, 0, 0, &m_sqlerr_msg) )
{
if( strstr(m_sqlerr_msg, "database is locked") )
{
sleep(1);
continue;
}
break;
}
}
3、解决方法三
用信号量做PV操作
sem_p(semid,0);
sqlite3_exec( myconn, sql, 0, 0, &m_sqlerr_msg);
sem_v(semid,0);
分享到:
相关推荐
Sqlite解决database locked问题
解决sqlite死锁示例异常database is locked示例
本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题。 SQLite是文件级别的数据库,其锁也是文件级别的:多个线程...
解决sqlite3 databaselocked 问题的代码实例,比较有参考价值。
sqlite实质上是将数据写入一个文件,通常情况下,在应用的包名下面都能找到xxx.db的文件,拥有root权限的手机,可以通过adb shell,看到data...完美解决sqlite的 database locked 或者是 error 5: database locked 问题
SQlite3报告 ppt database
基于python实现的sqlite队列,方便的处理sqlite并发。SqliteQueue是继承了threading.Thread的线程,并且维护了一个向sqlite请求的队列。支持peewee请求。SqlQuery简单的封装了SQL语句
SQLite数据库moandroid.database
sqlite数据库编辑工具SQLiteDatabaseBrowser sqlite数据库编辑工具SQLiteDatabaseBrowser
3、安装好unidac4后,其中有uniconnection可以连接sqlite3,ProviderName选SQLite即可,在Database那里输入数据库文件名称,SpecificOptions那里可以选择客户端dll,也就是你使用的sqlite3.dll,还有加密用到的密钥...
SQLite3基本数据库操作
使用sqlite3所需要用到的库文件等
gcc使用的sqlite3数据库,sqlite3.a ,可以用于Dev-C++,也可以用于Windows下使用gcc编译的程序,sqlite版本是:3270200,还包含了sqlite3.lib库文件,可以用于visual studio。
免费版sqlite不带加解密功能,这个wssqlite实现了加解密数据库的功能,网上好多都是不能编译成功的,所以作者编译后,可以直接使用该资源,包含(sqlite3.h,sqlite3.lib,sqlite2.dll,sqlite3userauth.h)
sqlite3_mod_*.dll ODBC SQLITE3 扩展 DLL\OBJ库支持数据库加密使用 支持API连接 支持ODBC连接 支持密码连接 ODBC下支持SQL格式修改密码 附带使用Delphi的Demo示例 修改密码 pragma password = 888888; ...
在调试Android上层系统时,经常需要改动到跟数据库相关的参数,光有SQL语句使用知识毫无用处,好在Android命令行下有sqlite3命令,而现在系统的应用会把数据保存到/data/data/包名/database/目录下,该目录下会有.db...
SQLite数据库系统设计与实现 英文原版PDF,非常好的SQLite源码学习文档
基于sqlite-amalgamation-3280000和wxsqlite3-3.3.1重编译版本,支持Sqlite3_key和Sqlite3_rekey方法
sqlite3.h sqlite3头文件~~~~~~~
基于sqlite3的加密版本的数据库动态链接库,附lib和.h头文件,新测试可用。可设置密码和修改密码,加密后的数据库文件是无法被打开的。官方提供的免费版本sqlite3都是没有加密的,官方收费的很贵哦,有需要的朋友...