美文网首页我爱编程
MongoClient执行js文件进行的回滚

MongoClient执行js文件进行的回滚

作者: 何甜甜在吗 | 来源:发表于2018-04-11 13:50 被阅读0次

1.简化流程:preCheck-->DBACheck1-->DBACheck2-->executeTask

2.CreateIndex和DataModification(DML)请求进行校验的地方
1)CreateIndex在preCheck中
2)DataModification(DML)在executeTask中,所以没有操作两次数据库

3.模拟DataModification(DML)的check
1)执行的js文件:24.js
针对DML,会将前端的用户请求写入js文件中

printjson(db.test_collection.save([{"f":1}, {"g":1}]))
printjson(db.test_collection.save({"h";1}))

2)执行语句

C:\Users\tianthe>mongo --quiet 127.0.0.1:27017/test 24.js
2018-04-11T11:03:35.493+0800 E QUERY    [thread1] SyntaxError: missing : after property id @24.js:2:38
failed to load: 24.js

失败,提示有语法错误

查询数据库集合

C:\Users\tianthe>mongo --quiet 127.0.0.1:27017/test --eval "db.test_collection.find({})"
{ "_id" : ObjectId("5acd6dbc9147fe2f3f473e37"), "a" : 1 }
{ "_id" : ObjectId("5acd6dbc9147fe2f3f473e38"), "b" : 1 }

没有成功插入,说明进行了回滚,不会重复插入数据

3.一些思考
mongodb中,单个文本具有原子性。针对多文本同时插入的操作,如果需要保证事务,需要通过两阶段提交来实现,
mongodb官方文档通过例举银行转账的例子来模拟了一个两阶段提交保证事务,逻辑实现起来还是挺复杂的,但很明显,运行的js文件中,只有简单的两条sql语句是如何做到的呢

两阶段提交.png

猜测:是由内置事务管理器实现
预备(prepare):保存事务信息
就绪(Ready):
尝试执行js文件中的:

printjson(db.test_collection.save([{"f":1}, {"g":1}]))
printjson(db.test_collection.save({"h";1}))

执行过程中会记录日志和rollback信息
如果成功执行(事务管理器没有收到失败或超时的消息),事务管理器会发送commit,完成执行
如果失败,就会根据记录信息进行回滚

参考:
https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/
http://zackku.com/mongo-transaction2/

相关文章

  • MongoClient执行js文件进行的回滚

    1.简化流程:preCheck-->DBACheck1-->DBACheck2-->executeTask 2.C...

  • java使用ScriptRunner执行sql文件

    主要是使用ScriptRunner来执行sql文件,传入.sql文件的位置即可。 支持出错回滚

  • RxJs

    脚本加载 = 脚本下载 + 执行 一般是同时 下载4个js文件 依次执行先返回的js文件 回调地狱 问题 一个变...

  • Git命令干货

    下载: 提交: 删除文件/文件夹: 回滚文件: 回滚版本:回滚到最近一次版本:方式1: 方式2: 回滚到某次提交:...

  • Fescar - RM undoExecutor介绍

    开篇  这篇文章的目的主要是讲解RM的执行回滚的Executor对象即undoExecutor,执行回滚日志就是由...

  • GIT实操手册 —— 如何做到精准回滚

    目录 一、如何将在工作区中修改的文件进行回滚(git checkout)恢复单个文件恢复所有文件编译器:VSCco...

  • 第三章 启动

    本节内容 启动 启动 执行 js 文件: 打开 node 的 console 控制台,执行某个 js 文件 比如,...

  • react-native-update热更新问题记录(版本回退)

    //必须要执行这个方法,不然回滚 markSuccess();

  • laravel 单元测试

    建模型 含数据迁移文件 创建修改模型迁移文件 执行最新数据迁移 回滚一次(如果之前漏了写错 重新构建数据库表(别...

  • js的理解

      js的执行,一个文件不管链接了多少个js文件,在载入执行的时候,都是按先后载入依次执行(js是单线程的):先执...

网友评论

    本文标题:MongoClient执行js文件进行的回滚

    本文链接:https://www.haomeiwen.com/subject/txyahftx.html