写入临时表时,SQLite3数据库文件是否全局锁定?

时间:2018-07-12 14:38:01

标签: database multithreading sqlite transactions locking

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

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

我将SQLite3版本3.13.0与默认日志模式等配合使用。

1 个答案:

答案 0 :(得分:0)

是的,您的理解是正确的。 SQLlite的并发效率不足,无法锁定整个数据库。请参考以下SQLlite文档之一的声明:

  

对SQLite的锁定支持SQLite数据库非常有限   支持并发。这与默认锁定有关   策略,命中列表行为和交易时长。

     

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

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