我正在使用sqlite进行项目。在我的项目中,我正在插入,获取并更新数据到datbase.But有时我的数据库的geeting错误被锁定,没有这样的表:tablename.I已经检查了我的代码sqlite3_open,sqlite3_prepare_v2,sqlite3_step,sqlite3_finalize和sqlite3_close。但我得到了问题。任何人都可以帮助我
答案 0 :(得分:2)
当您尝试从同一数据库连接同时对数据库执行两个不兼容的事情时,会出现此错误代码。例如,如果您位于SELECT语句的中间并尝试DROP SELECT读取的其中一个表,则会收到SQLITE_LOCKED错误。这是一个例子(使用Tcl):
db eval {SELECT rowid FROM ex1} {
if {$rowid==10} {
db eval {DROP TABLE ex1} ;# will give SQLITE_LOCKED error
}
}
请注意,SQLITE_LOCKED错误与SQLITE_BUSY(5)不同。 SQLITE_BUSY表示另一个数据库连接(可能在另一个进程中)正在以阻止您使用它的方式使用数据库。 SQLITE_LOCKED表示争用源是内部的,来自收到SQLITE_LOCKED错误的同一数据库连接。
以下是获取SQLITE_LOCKED错误的其他原因:
尝试在SELECT语句时创建或删除表或索引 还在等待。
有时人们认为他们已经完成了SELECT语句 因为sqlite3_step()已返回SQLITE_DONE。但SELECT是 在sqlite3_reset()或sqlite3_finalize()之前没有完全完成 被称为。
截至登记[3902](2007-05-02版本3.3.17之后),这是 现在允许CREATE语句。
尝试在SELECT处于活动状态时写入表 表。
尝试在同一张桌子上同时进行两次SELECT 多线程应用程序,如果没有设置sqlite。
fcntl(3,对DB文件的F_SETLK调用失败。这可能是由于
例如,NFS锁定问题。这个问题的一个解决方案是
将数据库移开,并将其复制回来,以便它有一个新的Inode
值。