数据库被锁定错误sqlite Ios

Posted

技术标签:

【中文标题】数据库被锁定错误sqlite Ios【英文标题】:database is locked error sqlite Ios 【发布时间】:2014-01-18 12:58:53 【问题描述】:

我正在使用 sqlite 进行项目。在我的项目中,我正在向数据库中插入、获取和更新数据。但有时我会收到数据库错误被锁定并且没有这样的表:表名。我已经检查了我的代码sqlite3_open、sqlite3_prepare_v2、sqlite3_step、sqlite3_finalize 和 sqlite3_close。但是我遇到了问题。任何人都可以帮我解决这个问题

【问题讨论】:

【参考方案1】:

当您尝试从同一数据库连接同时对数据库执行两项不兼容的操作时,会出现此错误代码。例如,如果您正处于 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 处于活动状态时写入表 桌子。

    截至签入 [3355](2006-08-16 版本 3.3.7 之后)这是现在 允许。

    尝试在同一时间在同一张表上执行两个 SELECT 多线程应用程序,如果 sqlite 未设置为这样做。

    fcntl(3, 对 DB 文件的 F_SETLK 调用失败。这可能是由 例如 NFS 锁定问题。这个问题的一个解决方案是 将 DB 移走,然后将其复制回来,使其具有新的 Inode 价值。

【讨论】:

你有解决这个问题的办法吗。欢迎大家参考。

以上是关于数据库被锁定错误sqlite Ios的主要内容,如果未能解决你的问题,请参考以下文章

获取sqlite繁忙异常[SQLITE_BUSY]数据库文件被锁定(数据库被锁定)

Ruby:SQLite3::BusyException:数据库被锁定:

新的 sqlite3 数据库被锁定

数据库被锁定在 Sqlite

Python SQLite:数据库被锁定

在 SQLite 中创建视图时出现“数据库已锁定”错误