sqlite3并发访问
SQLite是否安全地处理多个进程从同一个数据库读取/写入的并发访问? 有没有平台的例外呢?
如果大多数并发访问是读取(例如SELECT),SQLite可以很好地处理它们。 但是,如果你同时开始写作,locking争用可能成为一个问题。 那么很大程度上取决于你的文件系统有多快,因为SQLite引擎本身速度非常快,并有许多聪明的优化来减less争用。 特别是SQLite 3。
对于大多数台式机/笔记本电脑/平板电脑/手机应用程序来说,SQLite速度足够快,因为没有足够的并发性。 (Firefox使用SQLite广泛的书签,历史等)
对于服务器应用程序,前段时间有人说,一天中less于100K页面浏览量的东西可以在典型场景(如博客,论坛)中用SQLite数据库完美处理,而且我还没有看到相反的证据。 实际上,使用现代化的磁盘和处理器,95%的网站和Web服务在SQLite中都能正常工作。
如果你想真正快速的读/写访问,使用内存中的SQLite数据库。 RAM比磁盘快几个数量级。
是的,SQLite处理并发性很好,但从性能angular度来看,这并不是最好的。 据我所知,没有例外。 详细信息在SQLite的网站上: https : //www.sqlite.org/lockingv3.html
这个说法很有意思:“寻呼机模块可以确保变化一次全部发生,不pipe是所有变化发生还是没有变化,两个或多个进程不会尝试以不兼容的方式同时访问数据库”
似乎没有人提到WAL(预先写入日志)模式。 确保事务处理正确,并且在WAL模式设置的情况下,不需要保持数据库被locking,同时人们正在读取事物,同时进行更新。
唯一的问题是,在某些时候,WAL需要重新合并到主数据库中,并且在数据库的最后一次连接closures时执行此操作。 有一个非常繁忙的网站,你可能会发现需要几秒钟的所有连接接近,但每天100K点击不应该是一个问题。
这个线程是旧的,但我认为这将是很好的共享我的SQLitetesting的结果:我运行了2个实例的Python程序(不同进程相同的程序)执行语句SELECT和UPDATE事务中的SQL命令EXCLUSIVElocking和超时设置为10秒钟locking,结果令人沮丧。 每个实例在10000步循环中都做了:
- 用独占锁连接到数据库
- select一行读取计数器
- 用等于计数器加1的新值更新行
- closures连接到数据库
即使sqlite授予对事务的独占locking,真正执行的周期总数不等于20 000,但是less于两个进程中计数的单个计数器的总迭代次数。 Python程序几乎没有抛出任何单一的exception(只有一次select20次执行)。 testing时的sqlite版本是3.6.20和python v3.3 CentOS 6.5。 在我看来,最好是为这种工作find更可靠的产品或限制写入sqlite单一的独特的进程/线程。