问题描述
我正在研究嵌入式数据库。 我知道 sqlite 在处理写操作时必须锁定整个数据库。操作完成后,DB 自动释放锁。
我对 Berkeley DB 有同样的疑问(我阅读了 Berkeley 文档,但没有找到结论)。 所以我的问题很简单:在写操作时,Dose Berkeley DB 锁定整个数据库,还是仅锁定某个表?
非常感谢!
解决方法
简短的回答是:不,BerkeleyDB 不必锁定整个数据库。虽然锁定的细节因访问方法而异(有关更多信息,请参见此处 https://web.stanford.edu/class/cs276a/projects/docs/berkeleydb/ref/lock/am_conv.html),但 BerkeleyDB 的锁定几乎适用于数据库中的每个结构,例如页面和记录以及整个事物。
另请注意,BerkeleyDB 不是关系型数据库,因此无论如何都没有要锁定的“表”。
对于使用 BTREE 访问方法在正确配置的应用程序中对记录进行就地记录更新之类的事情,它可能只锁定包含该记录的数据库页面。有时,记录插入或删除(或改变记录大小的更新)会导致树的结构变化,包括从记录所在的叶子“向上”锁定一个或多个索引页。