【问题标题】:Does Berkeley DB lock entire database when in a writing operation?Berkeley DB 在写操作时会锁定整个数据库吗?
【发布时间】:2021-05-07 15:28:32
【问题描述】:

我正在研究嵌入式数据库。 我知道 SQLite 在处理写操作时必须锁定整个数据库。操作完成后,DB自动释放锁。

我对 Berkeley DB 也有同样的疑惑(我阅读了 Berkeley 文档,但没有找到结论)。 所以我的问题很简单:Dose Berkeley DB 在写操作时锁定整个数据库,还是只锁定某个表?

非常感谢!

【问题讨论】:

    标签: berkeley-db


    【解决方案1】:

    简短的回答是:不,BerkeleyDB 不必锁定整个数据库。虽然锁定的详细信息因访问方法而异(有关更多信息,请参见此处https://web.stanford.edu/class/cs276a/projects/docs/berkeleydb/ref/lock/am_conv.html),但 BerkeleyDB 的锁定几乎适用于数据库中的每个结构,例如页面和记录以及整个事物。

    另请注意,BerkeleyDB 不是关系数据库,因此无论如何都没有要锁定的“表”。

    对于使用 BTREE 访问方法在正确配置的应用程序中对记录进行就地记录更新之类的事情,它可能只锁定包含该记录的数据库页面。有时,记录的插入或删除(或改变记录大小的更新)会导致树的结构变化,包括从记录所在的叶子“向上”锁定一个或多个索引页。

    【讨论】:

    • 谢谢迈克!首先,我用错了“table”这个词;实际上我的意思是“页面”。其次,从您的回答中,我了解到如果读取和写入操作同时发生,但在两个不同的页面中,那么伯克利将允许它们发生(因为它只锁定写入影响的页面)。但是,如果读取和写入发生在一页中,那么伯克利就不会。真的吗?非常感谢
    • @Triho 在很多情况下都是如此。如果记录在同一页上,并且写入首先进入那里,那么读锁将不得不在写入之后等待。不同页面上的操作不会竞争。几个注意事项:您可以使用DB_DIRTY_READ 配置数据库,以允许读取查看未提交的写入数据。不过,这很难使用。如果你想这样做,你真的必须知道你的应用程序。此外,典型的页面大小通常为 4KiB(最大大小为 64KiB)。如果您的应用程序在同一个小页面上的记录竞争很多,那么更改您的应用程序是有意义的!
    • 谢谢迈克。很好的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多