我在内存中模式下使用共享缓存(在Shared Cache And In-Memory Databases中指定)从我的程序运行SQLite v3.7.17。我的程序是多线程的,所有这些线程都访问相同的内存数据库。
有没有什么方法可以配置或使用我的SQLite数据库,这样当两个线程在同一个表(但不同的行)上运行update
查询时,一个不等待另一个?也就是说,如何在内存数据库中实现行级锁定?
理论上这应该可行,因为我的SQLite数据在文件中不(因此文件系统写入不适用)。
答案 0 :(得分:3)
确定SQLite是否可以锁定行的文件系统不是。这是SQLite的架构。
即使使用预写日志记录you can only have one writer at a time。
作家只是将新内容附加到WAL文件的末尾。因为 作家不做任何会干扰读者行为的事情, 作家和读者可以同时运行。但是,既然有 只有一个WAL文件,一次只能有一个编写器。
答案 1 :(得分:2)
Sqlite不支持行锁定功能。我刚刚看到了sqlumdash,它基于Sqlite,具有行锁定功能。
请在以下位置进行检查: https://github.com/sqlumdash/sqlumdash/
据我所知,它是由东芝开发的
答案 2 :(得分:1)
这是一个更大的跨国情景吗?因为如果情况就像你描述的那么简单,那么行锁定与表锁定没有任何好处。
内存数据库不受I / O延迟的影响;它是CPU绑定的,并且CPU可以顺序处理两次写入更快,而不是它可以同时处理它们,因为后者具有所有相同的内存操作以及线程交换和行锁定开销。当然,在多CPU系统中,理论上可以同时写入不同的行,但支持行锁定的必要逻辑实际上需要比将记录写入内存的(普通)操作更长的时间。
在任何大小的IMDB中,可以保留单个表上的表锁以提高效率,同时可以在针对多个独立表的多个独立查询中同时使用多个CPU。