【问题标题】:SQLite The database file is locked during Insert/DeleteSQLite 数据库文件在插入/删除过程中被锁定
【发布时间】:2012-08-06 19:28:27
【问题描述】:

我正在使用一个 C++ shell 扩展 DLL,它用于读取、写入数据到 SQLite 数据库表中。还有另一个用于访问所有表的应用程序 (exe)。

有时,当我尝试删除/插入/更新 SQLite 数据库表时,我的 dll 会显示异常“数据库文件已锁定”。这是因为此时其他应用程序正在访问这些表。

有没有办法从我的 DLL 中解决这个问题?我可以使用链接中提到的解决方案吗:“http://stackoverflow.com/questions/6455290/implementing-sqlite3-busy-timeout-in-an-ios-app

在当前代码中,我使用CppSQLite3.cpp方法execQuery(const char* szSQL)来执行SQL查询。

请指教。

【问题讨论】:

    标签: visual-c++ sqlite


    【解决方案1】:

    首先您应该知道 SQLite 执行数据库级别的锁定。当您启动事务并且其他应用程序尝试将某些内容写入同一个数据库时,您会得到Database is locked,SQLite 会在sqlite3_busy_timeout 间隔之后自动尝试执行相同的查询。

    因此,诀窍是确保您的交易尽可能短,即
    1. 开始交易
    2. 更新/删除/插入
    3. 提交

    在这 3 个步骤之间没有任何其他内容。 并且根据您的交易量增加您的sqlite3_busy_timeout 间隔以适应您的应用程序。

    你可以试试WAL模式,可以同时读写SQLite。但它也有其自身的一系列缺点。可以参考 SQLitedocumentation

    【讨论】:

    • 谢谢@DJK。谢谢天哪。我们的 exe 和 DLL 应用程序正在访问相同的数据库表。 exe访问table1,table2和table3。 DLL 正在访问 table1 和 table2。问题是 exe-table3 插入需要更长的时间。这导致数据库文件锁定的情况。我认为解决方法是将 table3 移动到另一个数据库。我认为这将解决我们的问题
    • @JChan:不客气!当然,您可以将表移动到另一个数据库或增加适合您应用程序的繁忙时间!
    【解决方案2】:

    SQLite 对多用户和多事务有一些限制。这意味着您无法读取/写入来自不同事务的资源。更新数据库时,数据库将被锁定。

    以下是一些可能对您有所帮助的链接


    http://sqlite.org/c3ref/busy_timeout.html


    http://www.sqlite.org/c3ref/busy_handler.html

    祝你好运

    【讨论】:

      猜你喜欢
      • 2012-06-13
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      相关资源
      最近更新 更多