【问题标题】:Is a SQLite3 database file locked globally while writing to temp tables?SQLite3 数据库文件在写入临时表时是否全局锁定?
【发布时间】:2018-12-20 20:26:50
【问题描述】:

我有一个具有不同线程的应用程序,它们都访问一个通用的 SQLite3 数据库文件。所有线程都使用CREATE TEMP TABLE FileCacheTemp AS ... 之类的语句创建自己的连接句柄以及一些临时表。

现在,我使用BEGIN TRANSACTION 在一个线程上对临时表执行一个长时间运行的事务块,然后是多个INSERT INTO FileCacheTemp ... 语句并以COMMIT 完成。 SQLite3 会只锁定线程本地、非共享、内存中临时表的读/写,还是会为所有线程锁定整个数据库文件?

我正在使用 SQLite3 版本 3.13.0 和默认日记模式等。

【问题讨论】:

    标签: database multithreading sqlite transactions locking


    【解决方案1】:

    是的,你的理解是正确的。 SQLlite 在并发方面效率不够高,会锁定整个数据库。请参阅 SQLlite 文档之一中的以下语句:

    对 SQLite 的锁定支持 SQLite 数据库非常有限 支持并发。这对默认锁定有影响 策略、命中列表行为和事务长度。

    当 READ 锁被放置在记录或表上时(例如,当 检索记录),SQLite 锁定整个数据库,防止其他 应用程序在任何地方插入、更新或删除记录 数据库。

    链接:https://unifaceinfo.com/docs/0906/Uniface_Library_HTML/ulibrary/SLE_Locking_B33EF9F17B6F4EDE8821F4EA355D52B2.html

    【讨论】:

    • 不幸的是,locking 上的 SQLite 文档并未具体说明这是否也适用于附加数据库或内存数据库。
    猜你喜欢
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2013-09-28
    相关资源
    最近更新 更多