SQLite是否只为其他进程或单个进程的线程编写操作块数据库?

时间:2009-10-12 18:22:06

标签: asp.net multithreading sqlite

SQLite是否只为其他进程或单个进程的线程编写操作块数据库?是否可以在多线程(=多会话)ASP.Net应用程序中使用SQLite?

2 个答案:

答案 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常见问题解答中的这一条目可能会对您有所帮助:

  

Can multiple applications or multiple instances of the same application access a single database file at the same time?

     

多个进程可以具有相同的功能   数据库同时打开。   多个进程可以做一个   同时选择。但只有一个   过程可以改变   数据库随时都有,   但是。

所以,我只说一个进程/线程/任何可以在给定时刻写入数据库的内容。

(在FAQ页面上还有更多内容;您应该阅读它:我没有引用所有内容)


而且,关于多线程的事情:

  

Is SQLite threadsafe?

     

SQLite是线程安全的。我们这样做   许多用户选择的特许权   忽略了给出的建议   前一段。但为了成为   线程安全,必须编译SQLite   使用SQLITE_THREADSAFE   预处理器宏设置为1.两者都有   Windows和Linux预编译的二进制文件   在分发中编译了这个   方式。

(同一张注释)