【问题标题】:In LMDB, how to nest one RW transaction within another RW transaction? What is the practical usecase/application of nesting transactions in LMDB?在 LMDB 中,如何将一个 RW 事务嵌套在另一个 RW 事务中? LMDB 中嵌套事务的实际用例/应用是什么?
【发布时间】:2020-01-17 03:53:42
【问题描述】:

在页面上:http://www.lmdb.tech/doc/starting.html

§1

事务可以是读写的,也可以是只读的,读写事务可以嵌套。

§2

可以有多个同时活动的只读事务,但只有一个可以写入。一旦打开单个读写事务,所有进一步尝试开始一个事务将阻塞,直到第一个事务被提交或中止。但是,这对只读事务没有影响,它们可以随时继续打开。

那么,如果 lmdb 环境中一次只能存在一个 RW txn,如何将 RW 事务设为另一个 RW 事务的父级?


参考资料:

  1. txn 句柄构造函数mdb_txn_begin(...) 采用可选的 txn 句柄使其成为潜在事务的父级。因此,事先需要一个MDB_txn 实例,比如parent-txn-handle,以提供给mdb_txn_begin,使parent-txn-handle 成为would-be-child-txn-handle 的父级。

  2. 来自:nested transactions doc, for BerkeleyDB,因为 lmdb 的文档不包含嵌套 lmdb txn 语义的说明。

    嵌套事务用于为在较大事务范围内执行的操作子集提供事务保证。这样做可以让您独立于较大的事务提交和中止操作子集。

【问题讨论】:

    标签: transactions lmdb


    【解决方案1】:

    您所包含的参考资料似乎大部分都回答了您的问题。

    如上所述,当您创建嵌套事务时,您需要将父事务的句柄传递给mdb_txn_begin。 “一次只写一个事务”的限制不适用于父事务的子事务。

    您可以在不提交或中止父事务的情况下提交或中止子事务的效果。如果您提交,则更改将成为父事务更改的一部分(外界尚不可见)。然后必须提交父事务才能保存更改。

    正如您的 BDB 参考所描述的,如果您想在单个事务中执行多个独立的工作单元(可能出于性能原因),这可能会很有用。您可以打开一个父事务,然后在其自己的子事务中执行每个工作单元。如果某个工作单元出现故障,您可以在不影响其他工作单元的情况下将其回滚,然后继续处理剩余的工作单元。当您最终提交父级时,只有成功的单元才会应用于数据库。

    【讨论】:

    • 这是否意味着,在创建一个 RW txnA 之后,如果我将其设为另一个 RW txn 本身的子级,我可以创建另一个 RW txnB。所以我可以创建一个 RW txnA 但不能在它之外创建另一个 RW txnB。但是,当另一个 txnB 成为本身是 RW 的 txn 的孩子时,可以创建另一个 RW txn。
    • 是的,没错。但是,请注意,子事务几乎只对我上面描述的“独立单元”用例有用。在子事务提交/中止之前,父事务不能使用,因此您不能使用它来并行执行 2 个写入操作,例如。
    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多