如何防止sqlite busy
发布网友
发布时间:2022-04-10 14:59
我来回答
共1个回答
热心网友
时间:2022-04-10 16:28
SQLite作为一款小型的嵌入式数据库,本身没有提供复杂的锁定机制,无法内部管理多路并发下的数据操作同步问题,更谈不上优化,所以涉及到多路并发的情况,需要外部进行读写锁控制,否则SQLite会返回SQLITE_BUSY错误,以驳回相关请求。
返回SQLITE_BUSY主要有以下几种情况:
1、当有写操作时,其他读操作会被驳回
2、当有写操作时,其他写操作会被驳回
3、当开启事务时,在提交事务之前,其他写操作会被驳回
4、当开启事务时,在提交事务之前,其他事务请求会被驳回
5、当有读操作时,其他写操作会被驳回
6、读操作之间能够并发执行
可以设计如下的方案解决并发操作数据库被锁定的问题,同时保证读操作能够保持最大并发
1、采用互斥锁控制数据库写操作
2、只有拥有互斥锁的线程才能够操作数据库
3、写操作必须独立拥有互斥锁
4、读操作必须能够共享互斥锁,即在第一次读取的时候获取互斥锁,最后一次读取的时候释放互斥锁
下面给出一种解决SQLITE_BUSY的代码片段
int nCount=0;
int nRet=0;
do
{
nRet = sqlite3_exec( m_db , buf , 0 , 0 , &pErrMsg );
if (nRet == SQLITE_BUSY)
{
Sleep(1);
continue;
}
break;
} while (1);