我的问题基本上是在R中使用并行处理时是否安全,让多个线程同时访问SQLite数据库。
我知道SQLite是文件级别的dbs,因此每个连接都可以访问整个数据库。因此,可以同时进行多个连接(例如,通过SQLite3前端,在R中,通过RSQLite的dbConnect()
和dplyr的src_sqlite()
)。我想这是可以的,只要有一个用户可以确保在提交其他命令之前完成一路提交的命令。
但是使用多线程时,似乎有可能一个线程可能会向另一个线程提交的命令提交给SQLite数据库,而另一个线程可能没有完成。
底层SQLite引擎是否序列化接收到的命令,以确保在处理下一个命令之前完成一个命令,以避免创建数据库的不一致状态?
我已经阅读了有关锁定和“ACID”的SQLite文档,据我所知,这个文档的答案似乎是“是”。
但我想确保我已正确理解事情。
另一个问题是,让单独的线程同时提交实际更改数据库的命令是否安全 由于无法控制两个线程提交命令的确切时间,我假设使用可能以不一致的方式更改SQLite数据表的并行进程不是一个好主意 - 例如,让一个线程插入一个记录到一个表和另一个在同一个表上执行SELECT的线程。
答案 0 :(得分:3)
如果它正在读取数据库是可以的,但写入数据库会锁定数据库至少几毫秒。如果在写入时尝试读取(或在写入时写入),将返回错误,可用于确定是否应重试读/写操作。如果这是一个相对简单的过程,那么sqlite3
就可以了。 Source