摘要:官网中,对单文档的操作是原子性的。因此建议使用嵌入式文档来实现事务需求,而不是规范化的跨文档设计。所以开始提供了对副本集多文档事务的支持,注意是副本集,也就是说单是不生效的。上面创建的中的上添加了提供的注解,所以的事务可以和的事务统一管理。
官网:mongoDB中,对单文档的操作是原子性的。例如insertOne,updateOne等操作。因此建议使用嵌入式文档来实现事务需求,而不是规范化的跨文档设计。但是业务上例如三方数据依赖的需求往往使用嵌入式文档不是理想中的那么方便。所以4.0开始提供了对副本集多文档事务的支持,注意是副本集,也就是说单server是不生效的。
接下来的测试需要集群环境,赖得搭建,所以使用mongoDB Cloud提供的Altas的免费集群。
创建测试数据user
info
创建springboot项目 添加依赖org.springframework.boot spring-boot-starter-parent 2.1.5.RELEASE org.springframework.boot spring-boot-starter-web org.projectlombok lombok true com.alibaba fastjson 1.2.58 org.springframework.boot spring-boot-starter-data-mongodb
连接mongoDB
这里涉及到了Write Concern,推荐阅读MongoDB writeConcern原理解析
w=majority:数据写入到副本集大多数成员后向客户端发送确认,适用于对数据安全性要求比较高的场景,该选项会降低写入性能
w=1:默认的writeConcern,数据写入到Primary就向客户端发送确认
Read Concern推荐阅读MongoDB readConcern 原理解析
spring.data.mongodb.uri=mongodb+srv://vulgar:761341@cluster0-t16it.mongodb.net/vulgar_test?retryWrites=true&w=majority配置mongoDB事务管理
@Configuration public class MongoTransactionConfiguration { @Bean MongoTransactionManager mongoTransactionManager(MongoDbFactory factory) { return new MongoTransactionManager(factory); } }创建对应实体类
User.class
@Data @Document(collection = "user") public class User implements Serializable { private static final long serialVersionUID = -7257487638617643262L; private String username; private String password; private String sex; private Integer age; private String email; }
Info.class
@Data @Document(collection = "info") public class Info implements Serializable { private static final long serialVersionUID = 4494527542566322152L; private String username; private String description; }创建测试SERVICE
@Slf4j @Service("mongoService") public class MongoService { @Autowired private MongoTemplate mongoTemplate; @Transactional(rollbackFor = ArithmeticException.class) public void updateWithTransaction() { Query query = new Query(Criteria.where("username").is("vulgar-cd")); Update update = new Update(); update.set("age", 10); mongoTemplate.updateFirst(query, update, User.class); User user = mongoTemplate.findOne(query, User.class); log.info("user is {}", JSON.toJSON(user)); update = new Update(); update.set("description", "hahahaha"); mongoTemplate.updateFirst(query, update, Info.class); Info info = mongoTemplate.findOne(query, Info.class); log.info("info is {}", JSON.toJSON(info)); //测试事务回滚 int i = 1/0; } }创建测试CONTROLLER
@Slf4j @RestController public class MongoController { @Resource(name = "mongoService") private MongoService mongoService; @GetMapping("/transaction") public void updateWithTransaction() { mongoService.updateWithTransaction(); } }启动引用程序
可以看到程序连上了集群,然后在终端执行curl http://localhost:8080/transaction可以看到如下日志
最后查看mongoDB中的数据,可以看到数据没有被更改。
上面创建的MongoService中的updateWithTransaction上添加了spring提供的@Transactional注解,所以mongoDB的事务可以和mysql的事务统一管理。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75074.html
摘要:介绍事务和副本集副本集是的一种主副节点架构,它使数据得到最大的可用性,避免单点故障引起的整个服务不能访问的情况的发生。在事务中执行的数据操作是对外隔离的,也就是说事务中的操作是原子性的。中止当前的事务,并将事务中执行过的数据修改回滚。 前言 相信使用过主流的关系型数据库的朋友对事务(Transactions)不会太陌生,它可以让我们把对多张表的多次数据库操作整合为一次原子操作,这在高并...
摘要:参考链接官方关于事务的介绍中文社区关于的介绍如果不想进行第二步,可以直接为你创建一个新的复制集我只是个前端啊,为什么要这么折磨我 主管前几天发现mongoDB已经升级到4.0了,迫不及待得让我实现他期待已久的事务回滚,发现还是有很多坑啊!下面是我将已有的本地mongoDB升级到支持事务回滚的历程,分享出来,有错误的地方欢迎指正!以mac为例哈 部署mongodb事务回滚 1.准备工作 ...
摘要:原文保持更新及修正基于的客户端配置选项,其它驱动大同小异。连接池中连接的最大使用寿命毫秒。设置该选项后,客户端将进行以下行为以副本集模式连接,并根据给定的服务器发现副本集的所有成员。该选项可以和配合使用。编解码器用于对进行编码和解码。 原文保持更新及BUG修正:http://kweny.io/mongodb-clien... 基于 MongoDB Java Driver 3.8.1 ...
摘要:可水平扩展,可以添加更多服务器来扩展您的数据库需要管理员是否开发人员和管理员都可以使用适用场景会计师事务所和银行,以及需要具有清晰架构的结构化数据的其他公司。 今天的主题是从MongoDB漫谈数据库,在日常的项目中,我们一般都是使用的mysql作为数据库,但是一旦有问题,又常常会听到类似要不换成MongoDB试试的声音,因此就让我们这些小白来随便聊聊数据库 什么是数据库 我们就用最简单...
阅读 3430·2021-10-14 09:42
阅读 2717·2021-09-08 10:44
阅读 1299·2021-09-02 10:18
阅读 3599·2021-08-30 09:43
阅读 2793·2021-07-29 13:49
阅读 3718·2019-08-29 17:02
阅读 1575·2019-08-29 15:09
阅读 1034·2019-08-29 11:01