SQLite是否只为其他进程或单个进程的线程编写操作块数据库?是否可以在多线程(=多会话)ASP.Net应用程序中使用SQLite?
答案 0 :(得分:2)
您可能希望查看File Locking And Concurrency In SQLite Version 3。
特别是,我认为您对“EXCLUSIVE”数据库锁感兴趣:
EXCLUSIVE
为了写入数据库文件,需要一个EXCLUSIVE锁。文件上只允许一个EXCLUSIVE锁,并且不允许任何其他类型的锁与EXCLUSIVE锁共存。为了最大化并发性,SQLite可以最大限度地减少EXCLUSIVE锁定所需的时间。
当线程或进程对数据库具有独占锁定时,不允许所有其他操作(读取或写入)。
关于多会话ASP.net,我假设大部分时间,你只会从数据库中读取:
共享
可以读取数据库但不能写入。任意数量的进程可以同时保存SHARED锁,因此可以有许多同时读取器。但是,当一个或多个SHARED锁处于活动状态时,不允许其他线程或进程写入数据库文件。
SQLite数据库上的许多并发读取没有问题;您将仅受底层OS /文件系统的限制。如果你同时进行大量的读写操作,你可能会对Appropriate Uses for SQLite感兴趣,它指出:
SQLite通常可以作为中低流量网站(也就是所有网站的99.9%)的数据库引擎。当然,SQLite可以处理的Web流量大小取决于网站使用其数据库的程度。一般来说,每天点击次数少于100K的网站应该可以正常使用SQLite。 100K点击/天的数字是一个保守估计,而不是一个硬上限。 SQLite已被证明可以使用10倍的流量。
另外,在回复你对Pascal答案的评论时,如果你检查上面的链接,你会发现SQLite没有区分进程或线程,因为所有的锁都依赖于文件系统,而不是任何程序级锁。
寻呼机模块有效地控制对单独线程或单独进程或两者的访问。在整个文档中,只要写入“过程”一词,您就可以替换“线程”一词而不改变陈述的真实性。
答案 1 :(得分:0)
SQLite常见问题解答中的这一条目可能会对您有所帮助:
多个进程可以具有相同的功能 数据库同时打开。 多个进程可以做一个 同时选择。但只有一个 过程可以改变 数据库随时都有, 但是。
所以,我只说一个进程/线程/任何可以在给定时刻写入数据库的内容。
(在FAQ页面上还有更多内容;您应该阅读它:我没有引用所有内容)
而且,关于多线程的事情:
SQLite是线程安全的。我们这样做 许多用户选择的特许权 忽略了给出的建议 前一段。但为了成为 线程安全,必须编译SQLite 使用SQLITE_THREADSAFE 预处理器宏设置为1.两者都有 Windows和Linux预编译的二进制文件 在分发中编译了这个 方式。
(同一张注释)