【发布时间】:2021-05-07 15:28:32
【问题描述】:
我正在研究嵌入式数据库。 我知道 SQLite 在处理写操作时必须锁定整个数据库。操作完成后,DB自动释放锁。
我对 Berkeley DB 也有同样的疑惑(我阅读了 Berkeley 文档,但没有找到结论)。 所以我的问题很简单:Dose Berkeley DB 在写操作时锁定整个数据库,还是只锁定某个表?
非常感谢!
【问题讨论】:
标签: berkeley-db
我正在研究嵌入式数据库。 我知道 SQLite 在处理写操作时必须锁定整个数据库。操作完成后,DB自动释放锁。
我对 Berkeley DB 也有同样的疑惑(我阅读了 Berkeley 文档,但没有找到结论)。 所以我的问题很简单:Dose Berkeley DB 在写操作时锁定整个数据库,还是只锁定某个表?
非常感谢!
【问题讨论】:
标签: berkeley-db
简短的回答是:不,BerkeleyDB 不必锁定整个数据库。虽然锁定的详细信息因访问方法而异(有关更多信息,请参见此处https://web.stanford.edu/class/cs276a/projects/docs/berkeleydb/ref/lock/am_conv.html),但 BerkeleyDB 的锁定几乎适用于数据库中的每个结构,例如页面和记录以及整个事物。
另请注意,BerkeleyDB 不是关系数据库,因此无论如何都没有要锁定的“表”。
对于使用 BTREE 访问方法在正确配置的应用程序中对记录进行就地记录更新之类的事情,它可能只锁定包含该记录的数据库页面。有时,记录的插入或删除(或改变记录大小的更新)会导致树的结构变化,包括从记录所在的叶子“向上”锁定一个或多个索引页。
【讨论】:
DB_DIRTY_READ 配置数据库,以允许读取查看未提交的写入数据。不过,这很难使用。如果你想这样做,你真的必须知道你的应用程序。此外,典型的页面大小通常为 4KiB(最大大小为 64KiB)。如果您的应用程序在同一个小页面上的记录竞争很多,那么更改您的应用程序是有意义的!