• MongoDB 操作手冊CRUD 事务 两步提交


    运行两步提交

    概述

    这部分提供了多记录更新或者多记录事务。使用两步提交来完毕多记录写入的模板。

    另外。能够扩展此方法来提供rollback-like功能。

    背景

    MongoDB对于单条记录的操作是原子性的。可是涉及多条记录的操作却不是原子性的。

    因为记录可能是相当复杂。而且有内嵌记录,单记录原子性操作提供了实际中经常使用的必要支持。


    除了单记录的原子性操作,还有很多情况须要多记录操作事务。当运行一个包括一些列操作的事务时,就有下面要求:
    原子性:假设一个操作失败,事务中之前的操作须要回滚到之前的状态
    一致性:假设一个重大失误,比方网络故障,硬件故障,中断了事务,数据库必须可以恢复到之前的状态
    对于须要多记录操作的事务,能够在应用中实现两步提交的方法,来提供多记录更新支持。

    使用这样的方法保证了一致性。而且万一出现错误,事务的运行状态是可恢复的。然而在这个过程中。记录处于未定的数据和状态。
    注意:由于MongoDB仅仅有单记录操作是原子性的,两步提交仅仅能提供语义上的“类事务”功能。

    对于应用来说,使其可以回到在两步提交中的某个状态的中间数据或者回滚数据。


    模板

    考虑下面情景:

    要将资金从账户A转移到账户B,在关系型数据库中,能够在一个事务中从A中减去资金,同一时候在B中加上。在MongoDB中,能够模拟两步提交来获得同样结果。

    这个样例使用两个集合
    1.accounts,用于存储账户信息
    2.transactions,用于存储资金转移事务的信息

    初始化账户信息

    db.accounts.insert(
    [
    { _id: "A", balance: 1000, pendingTransactions: [] },
    { _id: "B", balance: 1000, pendingTransactions: [] }
    ]
    );

    初始化转账记录

    对于每次资金转移操作,将转账信息加入到transactions集合中,插入的记录包括下面信息:
    source和destination字段。引用自ccounts集合中的_id字段
    value字段,声明转移数值
    state字段,表明当前转移状态,值能够是initial,pending, applied, done, canceling, 或者 canceled.
    lastModified字段,反应最后改动日期

    从A转账100到B,初始化transactions记录:
    db.transactions.insert({ _id: 1, source: "A", destination: "B", value: 100, state: "initial", lastModified: new Date() });

    使用两步提交进行转账

    1.从transactions集合中,找到state为initial的记录。

    此时transactions集合中仅仅有一条记录,即刚插入的那条。

    在包括其它记录的集合中,除非你声明了其它查询条件。否则这个查询将返回不论什么state为initial的记录。


    var t = db.transactions.findOne( { state: "initial" } );
    在MongoDB的shell中输入t,查看t的内容,类似于:
    { "_id" : 1, "source" : "A", "destination" : "B", "value" : 100, "state" : "initial", "lastModified":?

    ?

    }
    2.更新事务状态为pending
    设置state为pending,lastModified为当前时间
    db.transactions.update(
    { _id: t._id, state: "initial" },
    {
    相关阅读:
    How do I add elements to a Scala List?
    Can you share some Scala List class examples?
    How to add elements to a List in Scala
    数据结构和算法学习三,之递归和堆栈
    数据结构和算法学习二,之循环和递归
    数据结构和算法学习一,开篇
    Android Skia和2D图形系统 .
    EGL接口介绍-----Android OpenGL ES底层开发
    OpenGL网络资源
    OpenGL—Android 开机动画源码分析二

  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6904703.html
Copyright © 2020-2023  润新知