mongoDB单个实例不支持事务,副本集才支持事务
- 1.准备好docker
- 2.Spring boot 版本为2.1.1.RELEASE及以上
首先以主从模式安装mongodb 4.0.0以上的数据库实例,使用以下docker命令安装:(最新版不支持这种模式,必须是副本及模式,如果简单测试,可以使用)
docker run --privileged=true -p 10011:27017 -v $PWD/db1:/data/db -d --name template-db1 mongo:4.0.0 --replSet "templateRs0" --bind_ip_all
docker run --privileged=true -p 10012:27017 -v $PWD/db2:/data/db -d --name template-db2 mongo:4.0.0 --replSet "templateRs0" --bind_ip_all
然后连接到一个数据库实例以以下脚本初始化主节点:
rs.initiate( {
_id : "templateRs0",
members: [
{ _id: 0, host: "172.16.2.87:10011" },
{ _id: 1, host: "172.16.2.87:10012" },
]
})
rs.status()
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
创建配置类,开启事务
@Configuration
public class TransactionConfig {
@Bean
MongoTransactionManager transactionManager(MongoDbFactory factory){
return new MongoTransactionManager(factory);
}
}
开启事务:
@Service
public class UserService {
@Resource
MongoTemplate mongotemplate;
public List<User> getAllUser(){
return mongotemplate.findAll(User.class);
}
@Transactional
public boolean addUser(User user, UserInfo userInfo){
user.setUserInfo(userInfo);
mongotemplate.save(userInfo);
// int a = 1/0; //事务测试代码
mongotemplate.save(user);
return true;
}
}
注:以上为MongoTemplate方式,MongoTemplate和MongoRepository方式都与Spring整合SpringDataMongoDB相同