当前位置: 首页 > 科技观察

SQLite,多个应用程序可以同时访问一个数据库文件吗?

时间:2023-03-12 16:35:51 科技观察

多个进程可以同时打开同一个数据库。多个进程可以同时执行SELECT。但是,任何时候都只有一个进程可以对数据库进行更改。SQLite使用读/写锁来控制对数据库的访问。(在Win95/98/ME下,缺乏对读写锁的支持,而是使用概率模拟。)但要注意:如果数据库文件保存在NFS文件系统上,这种锁定机制可能无法正常工作。这是因为许多NFS实现会破坏fcntl()文件锁定。如果多个进程可能同时尝试访问该文件,则应避免将SQLite数据库文件放在NFS上。在Windows上,Microsoft的文档说如果没有运行Share.exe守护程序,锁定可能无法在FAT文件系统下工作。有很多Windows经验的人告诉我,网络文件的文件锁定是非常错误和不可靠的。我们知道没有其他嵌入式SQL数据库引擎支持与SQLite一样多的并发性。SQLite允许多个进程同时打开数据库文件,也允许多个进程同时读取数据库。当任何进程想要写入时,它必须在更新期间锁定整个数据库文件。但这通常只需要几毫秒。其他流程只是等待作者完成,然后继续他们的业务。其他嵌入式SQL数据库引擎通常一次只允许一个进程连接到数据库。但是,客户端/服务器数据库引擎(如PostgreSQL、MySQL或Oracle)通常支持更高级别的并发性,并允许多个进程同时写入同一数据库。这在客户端/服务器数据库中是可能的,因为总是有一个控制良好的服务器进程可用于协调访问。如果您的应用程序需要大量并发,那么您应该考虑使用客户端/服务器数据库。但经验表明,大多数应用程序需要的并发性远低于设计者的想象。默认行为是当SQLite试图访问被另一个进程锁定的文件时返回SQLITE_BUSY。您可以使用sqlite3_busy_handler()或sqlite3_busy_timeout()API函数从C代码调整此行为。