SQLite3中的表的线程安全和并发修改

时间:2008-12-10 07:17:13

标签: multithreading sqlite thread-safety

SQLite3的线程安全是否意味着不同的线程可以同时修改数据库的同一个表?

4 个答案:

答案 0 :(得分:6)

否 - SQLite不支持对同一数据库文件的并发写访问。 SQLite只会阻止其中一个事务,直到另一个完成。

答案 1 :(得分:4)

请注意,如果您使用的是python,要从不同的线程访问sqlite3连接,您需要禁用check_same_thread参数,例如:

sqlite.connect(“:memory:”,check_same_thread = False)

截至2010年5月24日,文档省略了此选项。遗漏被列为错误here

答案 2 :(得分:1)

不一定。如果使用线程安全宏编译sqlite3(通过

int sqlite3_threadsafe(void)
函数检查),那么您可以尝试从多个线程访问同一个DB而不存在损坏的风险。但是,根据所需的锁定,您可能会或可能无法实际修改数据(我不相信sqlite3支持行锁定,这意味着要写入,您需要获得表锁定)。但是,你可以尝试;如果一个线程阻塞,那么一旦另一个线程完成DB,它就会自动写入。

答案 3 :(得分:1)

您可以在3种不同模式下使用SQLite:

http://www.sqlite.org/threadsafe.html

如果您决定使用多线程模式或序列化模式,则可以在多线程应用程序中轻松使用SQLite。 在这些情况下,无论如何都可以同时读取所有线程。如果您需要同时写入,则打开的表将自动锁定当前写入线程并在此之后解锁(下一个线程将等待(mutex)轮到该表将被解锁)。在所有这些情况下,您需要为每个线程(.NET Data.Sqlite.dll)创建单独的连接字符串。如果您正在使用其他实现(例如任何Android包装器),有时情况会有所不同。