我有一个具有不同线程的应用程序,它们都访问一个公共的SQLite3数据库文件。所有线程都使用诸如CREATE TEMP TABLE FileCacheTemp AS ...
之类的语句创建自己的连接句柄以及一些临时表。
现在,我使用BEGIN TRANSACTION
在一个线程上对temp表执行长时间运行的事务块,然后执行多个INSERT INTO FileCacheTemp ...
语句并以COMMIT
结束。是SQLite3锁定仅读写本地线程,非共享的内存临时表,还是锁定所有线程的整个数据库文件?
我将SQLite3版本3.13.0与默认日志模式等配合使用。
答案 0 :(得分:0)
是的,您的理解是正确的。 SQLlite的并发效率不足,无法锁定整个数据库。请参考以下SQLlite文档之一的声明:
对SQLite的锁定支持SQLite数据库非常有限 支持并发。这与默认锁定有关 策略,命中列表行为和交易时长。
在记录或表上放置READ锁时(例如,当 检索记录),SQLite锁定整个数据库,防止其他 应用程序从不插入,更新或删除记录的任何位置 数据库。