介绍
- 从MongoDB4.0版本开始支持事务。
- MongoDB需要配置副本集。(副本集配置自行百度)
- SpringBoot版本2.3.3.RELEASE
使用说明
1、引入monogo依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- 辅助工具包, 简化常用代码,例如get,set,toString等 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<optional>true</optional>
</dependency>
2、配置mongo连接
# 副本集:192.168.1.20:27018, 192.168.1.20:27019,192.168.1.20:27020
# 库名: first
# 在connect=replicaSet 模式下,驱动仅仅连接主服务器,并且所有的读写命令都连接到主服务器。
spring.data.mongodb.uri=mongodb://192.168.1.20:27018,192.168.1.20:27019,192.168.1.20:27020/first?connect=replicaSet&maxPoolSize=50&minPoolSize=10
3、事务配置类
@Configuration
public class MongoTransactionConfig {
@Bean
MongoTransactionManager transactionManager(MongoDatabaseFactory factory){
return new MongoTransactionManager(factory);
}
}
4、实体类
@Data //get,set,toString
@Builder
public class Article {
@Id
private String id;
private String title;
private String content;
private String status;
private Date createTime;
}
5、DAO
//MongoRepository<实体类, 主键类型>
public interface ArticleRepository extends MongoRepository<Article, String> {
}
6、Service
public interface ArticleService {
//存草稿
String draft(Article article);
//发布文章
String publish(Article article);
}
@Service
public class ArticleServiceImpl implements ArticleService {
@Autowired
ArticleRepository articleRepository;
@Override
public String draft(Article article) {
article.setStatus("DRAFT");
articleRepository.save(article);
//do something
//模拟异常
int i = 1/0;
return article.getId();
}
@Override
@Transactional//事务注解
public String publish(Article article) {
article.setStatus("PUBLISH");
articleRepository.save(article);
//模拟异常
int i = 1/0;
//do something
return article.getId();
}
}
7、Junit测试类
@SpringBootTest
class ArticleServiceTest {
@Autowired
ArticleService articleService;
@Test
void draft() {
Article article = Article.builder()
.title("草稿-标题")
.content("内容-标题")
.build();
articleService.draft(article);
}
@Test
void publish() {
Article article = Article.builder()
.title("发布-标题")
.content("发布-内容")
.build();
articleService.publish(article);
}
}
8、查看执行结果
use first;
db.getCollection("article").find({});
注解@Transactional的方法数据已经回滚
{
"_id" : ObjectId("5faba990d32cf24a106df1c2"),
"title" : "草稿-标题",
"content" : "内容-标题",
"status" : "DRAFT",
"_class" : "com.yanyuan.first.entity.Article"
}
参考资料
MongoDB事务
源码地址:first-springboot
源码分支:monogo-transaction