数据库被锁定错误SQLite iOS

3

我正在使用 SQLite 开发项目。在我的项目中,我需要将数据插入、获取和更新到数据库中。但有时会出现“数据库已锁定”和“找不到表格名”的错误。我已经检查了 sqlite3_open、sqlite3_prepare_v2、sqlite3_step、sqlite3_finalize 和 sqlite3_close 的代码,但仍然存在问题。请问有没有人能够帮助解决这个问题?

1个回答

2

当您尝试在同一数据库连接中同时执行两个不兼容的操作时,会出现此错误代码。例如,如果您正在执行SELECT语句,并尝试删除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错误的其他原因:
1. 在仍有SELECT语句未完成时尝试创建或删除表或索引。 - 有时人们认为他们已经完成了SELECT语句,因为sqlite3_step()已返回SQLITE_DONE。但是,在调用sqlite3_reset()或sqlite3_finalize()之前,SELECT实际上并未真正完成。 - 截至[3902](版本3.3.17之后),“CREATE”语句现在被允许执行此操作。
2. 在对同一表进行SELECT时,尝试向该表写入数据。 - 从[3355](版本3.3.7之后)开始,现在可以这样做。
3. 在多线程应用程序中同时在同一张表上执行两个SELECT查询,如果sqlite没有设置为执行此操作。
4. fcntl(3,F_SETLK调用DB文件失败。例如,这可能是由NFS锁定问题引起的。解决此问题的一种方法是将DB移开,然后将其复制回来,使其具有新的Inode值。

你有没有解决那个问题的方案?欢迎提供任何参考资料。 - chakshu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接