如何在内存中的SQLite数据库上实现行级锁定?

时间:2013-08-20 10:57:58

标签: database sqlite

我在内存中模式下使用共享缓存(在Shared Cache And In-Memory Databases中指定)从我的程序运行SQLite v3.7.17。我的程序是多线程的,所有这些线程都访问相同的内存数据库。

有没有什么方法可以配置或使用我的SQLite数据库,这样当两个线程在同一个表(但不同的行)上运行update查询时,一个不等待另一个?也就是说,如何在内存数据库中实现行级锁定?

理论上这应该可行,因为我的SQLite数据在文件中(因此文件系统写入适用)。

3 个答案:

答案 0 :(得分:3)

确定SQLite是否可以锁定行的文件系统不是。这是SQLite的架构。

即使使用预写日志记录you can only have one writer at a time

  

作家只是将新内容附加到WAL文件的末尾。因为   作家不做任何会干扰读者行为的事情,   作家和读者可以同时运行。但是,既然有   只有一个WAL文件,一次只能有一个编写器。

SQLite3 has a kind of table locking now,但不是行锁定。

答案 1 :(得分:2)

Sqlite不支持行锁定功能。我刚刚看到了sqlumdash,它基于Sqlite,具有行锁定功能。

请在以下位置进行检查: https://github.com/sqlumdash/sqlumdash/

据我所知,它是由东芝开发的

答案 2 :(得分:1)

这是一个更大的跨国情景吗?因为如果情况就像你描述的那么简单,那么行锁定与表锁定没有任何好处。

内存数据库不受I / O延迟的影响;它是CPU绑定的,并且CPU可以顺序处理两次写入更快,而不是它可以同时处理它们,因为后者具有所有相同的内存操作以及线程交换和行锁定开销。当然,在多CPU系统中,理论上可以同时写入不同的行,但支持行锁定的必要逻辑实际上需要比将记录写入内存的(普通)操作更长的时间。

在任何大小的IMDB中,可以保留单个表上的表锁以提高效率,同时可以在针对多个独立表的多个独立查询中同时使用多个CPU。