VI.Multidocument Transactions
2021/4/30 18:25:20
本文主要是介绍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()
这篇关于VI.Multidocument Transactions的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16在电脑上怎么模拟手机的运行环境?-icode9专业技术文章分享
- 2024-11-16接收socket数据,莫名其妙socket就关闭了是怎么回事?-icode9专业技术文章分享
- 2024-11-16ts nightly是什么?-icode9专业技术文章分享
- 2024-11-16如何升级vscode版本?-icode9专业技术文章分享
- 2024-11-16如何设置vscode默认的node版本?-icode9专业技术文章分享
- 2024-11-16shell 如何创建一个文件夹?-icode9专业技术文章分享
- 2024-11-16useReducer案例详解:从零开始理解与应用
- 2024-11-15聊聊用LangChain4J构建聊天机器人的那些事儿
- 2024-11-15LangChain 和 LlamaIndex 在检索增强生成(RAG)中的大比拼:全面对比评测
- 2024-11-15平台工程不只是配置管理:超越CFEngine的方法