【问题标题】:How to achieve row-level locking on an in-memory SQLite db?如何在内存 SQLite db 上实现行级锁定?
【发布时间】:2021-12-13 15:04:31
【问题描述】:

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

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

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

【问题讨论】:

标签: database sqlite


【解决方案1】:

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

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

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

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

【讨论】:

  • 看来没办法了。 :-(
【解决方案2】:

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

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

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

【讨论】:

  • SQLumDash 看起来很有趣,可惜他们似乎只有 0 个文档。
【解决方案3】:

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

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

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

【讨论】:

  • IMDB。使用内存数据库有一段时间了,但从未以这种方式使用过这个术语。不错。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多