我想使用不同的Berkeley-DB数据库在我的应用程序中存储不同类别的对象。单个DB中的事务可以使用DbTxn :: commit以原子方式完成。但是,如果我使用多个数据库,我必须创建多个事务(每个数据库一个),对吧?在这种情况下,如果提交第一个成功但第二个成功失败,是否有办法回滚已经提交的第一个事务? (据我所知,DbTxn :: abort,在提交事务后不再可以使用它。)
有没有办法在多个数据库之间实现原子事务?
答案 0 :(得分:3)
如果您使用多个数据库,那么您不必创建多个事务。通过使用单个事务,您可以在多个DB上运行。
有关Db :: Open()的文档,请参阅this link。
它具有'DbTxn * txnid'参数。您可以指定DB_ENV-> 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