Berkeley-DB:多个数据库的原子事务

时间:2014-04-14 06:14:08

标签: c++ database berkeley-db

我想使用不同的Berkeley-DB数据库在我的应用程序中存储不同类别的对象。单个DB中的事务可以使用DbTxn :: commit以原子方式完成。但是,如果我使用多个数据库,我必须创建多个事务(每个数据库一个),对吧?在这种情况下,如果提交第一个成功但第二个成功失败,是否有办法回滚已经提交的第一个事务? (据我所知,DbTxn :: abort,在提交事务后不再可以使用它。)

有没有办法在多个数据库之间实现原子事务?

2 个答案:

答案 0 :(得分:3)

如果您使用多个数据库,那么您不必创建多个事务。通过使用单个事务,您可以在多个DB上运行。

有关Db :: Open()的文档,请参阅this link

它具有'DbTxn * txnid'参数。您可以指定DB_EN​​V-> txn_begin()API返回的事务ID。因此,在打开数据库之前,应该获取事务ID。

仔细阅读给定文档链接中参数“ txnid ”下的注释。

请注意,您不应在Db :: open()API中指定DB_AUTO_COMMIT标志。而不是那样,您将为要操作的所有DB为参数'txnid'指定相同的事务ID。通过这种方式,您可以跨多个数据库实现原子事务。

答案 1 :(得分:0)

一般来说,你需要像分布式转换管理器这样的东西,完整的答案填写书籍。参见" The Berkeley DB Book",CHAPTER 9," Distributed Transactions and Data-Distribution Strategies",ISBN-10:1-59059-672-2