8

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

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

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

4

4 回答 4

7

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

即使使用预写日志记录,您一次也只能有一个写入器

编写器只是将新内容附加到 WAL 文件的末尾。因为 writer 不会做任何会干扰 reader 动作的事情,所以 writer 和 reader 可以同时运行。但是,由于只有一个 WAL 文件,因此一次只能有一个写入器。

SQLite3 现在有一种表锁定,但没有行锁定。

于 2013-08-20T11:24:49.830 回答
5

Sqlite 不支持行锁功能。而且我刚刚看到基于 Sqlite 的 sqlumdash 具有行锁定功能。

请查看: https ://github.com/sqlumdash/sqlumdash/

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

于 2018-10-30T08:17:46.220 回答
1

这是在更大的跨国场景中吗?因为如果情况像您描述的那样简单,那么行锁定与表锁定没有任何优势。

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

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

于 2014-05-01T20:51:56.780 回答
0

sqlite3 不支持行级锁。如果您可以保证 item 是唯一的或不需要是唯一的,那么您可以使用多个文件。

只需制作多个 sqlite3 数据库(文件)并打开它。如果您制作 50 分贝,那么您可以同时处理 50 行。

于 2021-12-13T07:04:31.833 回答