VI.Multidocument Transactions

Recipe 6-1. Working with Multidocument Transactions(多文档事务处理)
  1.使用以下命令开启主从数据库并切换至20001的主数据
    start mongod --bind_ip localhost --dbpath E:\study\ducument\technology\2020\mongodb\res1 --port 20001 --replSet myrs
    start mongod --bind_ip localhost --dbpath E:\study\ducument\technology\2020\mongodb\res2 --port 20002 --replSet myrs
    start mongod --bind_ip localhost --dbpath E:\study\ducument\technology\2020\mongodb\res3 --port 20003 --replSet myrs
    mongo.exe localhost:20001
  2.使用employee数据库并创建容器
    use employee
    db.createCollection("employee")
  3.向容器employee中插入数据
    db.employee.insert([{_id:1001,empName:"Subhashini"},{_id:1002, empName:"Shobana"}])
  4.开启事务,在此事务中插入新数据并提交(注意,要一并操作,不然事务会超时)
    session.startTransaction()
    session.getDatabase("employee").employee.insert([{_id:1003,empName:"Taanushree"},{_id:1004, empName:"Aruna M S"}])
    session.commitTransaction()
  5.获取内部事务的数据,即包含session提交的数据,可以看到session事务添加的两条记录
    session.getDatabase("employee").employee.find()
  6.获取外部事务的数据,如果session已经提交,则看到的结果同5,否则,看不到session提交的数据
    db.employee.find()


Recipe 6-2. Isolation Test Between Two Concurrent Transactions(独立两个事务)
 1.基于Recipe 6-1的操作后继续
 2.创建session1并更新数据
    var session1 = db.getMongo().startSession()
    session1.startTransaction()
    session1.getDatabase("employee").employee.update({_id:1003},{$set:{designation: "TL" }})
    session.commitTransaction()
 3.查看更新后的数据,1003的数据改变了
    session1.getDatabase("employee").employee.find()
 4.创建session2并更新数据
    var session2 = db.getMongo().startSession()
    session2.startTransaction()
    session2.getDatabase("employee").employee.update({_id:{$in:[1001,1004]}},{$set:{designation:"SE"}},{multi:"true"})
    session.commitTransaction()
  5.查看session2更新的数据,但是session1更新的数据没有在此session2中变化
    session2.getDatabase("employee").employee.find()

Recipe 6-3. Transactions with Write Conflicts(写事务冲突)
    1.基于Recipe 6-2的操作后继续
    2.开启一个session
        var session1 = db.getMongo().startSession()
        session1.startTransaction()
    3.session1执行更新数据
        session1.getDatabase("employee").employee.update({empName:"Subhashini"},{$set:{empName: "Subha" }})
    4.开启另一个session
        var session2 = db.getMongo().startSession()
        session2.startTransaction()
    5.session2执行更新数据
        session2.getDatabase("employee").employee.update({empName:"Subhashini"},{$set:{empName: "Subha" }})
    6.session2执行事务时会报错
    7.以上的操作最后使用如下一并执行,这样才可以看到结果
        var session1 = db.getMongo().startSession()
        session1.startTransaction()
        session1.getDatabase("employee").employee.update({empName:"Subhashini"},{$set:{empName: "Subha" }})
        var session2 = db.getMongo().startSession()
        session2.startTransaction()
        session2.getDatabase("employee").employee.update({empName:"Subhashini"},{$set:{empName: "Subha" }})

Recipe 6-4. Discarding Data Changes with abortTransaction (丢弃事务执行失败的数据)
    1.基于Recipe 6-1的操作后继续
    2.切换数据库并创建新的容器
        use student;
        db.createCollection("student")
    3.向新的容器中插入数据
        db.student.insert({_id:1001,name:"subhashini"})
        db.student.insert({_id:1002,name:"shobana"})
    4.开启session
        var session1 = db.getMongo().startSession()
        session1.startTransaction()
    5.session1更新数据
        session1.getDatabase("student").student.insert({_id:1003,name:"Taanushree"})
    6.查询数据,可以看到插入的数据
        session1.getDatabase("student").student.find()
    7.使用以下查询,看不到更新数据因为事务没有提交
        db.student.find()
    8.让事务夭折
        session1.abortTransaction()
    9.使用以下的查询,没有看到插入的数据,因为事务没有提交就夭折了
        db.student.find()
        

上一篇:关联分析(4):购物篮数据转换R语言


下一篇:存储引擎