mongoDB 事务
官网:https://docs.mongodb.com/manual/core/transactions/
使用示例
application.yml
spring:
data:
mongodb:
uri: mongodb://172.18.0.21:27017,172.18.0.22:27017,172.18.0.23:27017/test
注意:
事务中只能读主库,从库不能读,开启读从库会报错(Read preference in a transaction must be primary)
如果集合不存在,插入数据会报错,需事先好创建集合,报错信息:"Cannot create namespace test.user in multi-document transaction.; nested exception is com.mongodb.MongoWriteException: Cannot create namespace test.user in multi-document transaction.",4.4版本开始,事务中可自动创建集合
**********************
配置事务管理器
@Configuration
public class DataConfig {
@Bean
public MongoTransactionManager initMongoTransactionManager(MongoDbFactory factory){
return new MongoTransactionManager(factory);
}
}
**********************
serviceImpl 层
@Service
public class UserServiceImpl implements UserService {
@Autowired
private MongoTemplate mongoTemplate;
@Override
@Transactional
public void save(User user) {
mongoTemplate.save(user);
}
@Override
@Transactional
public void updateById(Integer id) {
Query query= Query.query(Criteria.where("id").is(id));
Update update=Update.update("name","海贼王");
mongoTemplate.updateFirst(query,update, User.class);
if(id.equals(2)){
throw new RuntimeException("id为:"+id+" 的user对象更新失败,事务回滚");
}
}
}
**********************
controller 层
@RestController
public class UserController {
@Resource
private UserService userService;
@Resource
private MongoTemplate mongoTemplate;
@RequestMapping("/save")
public String save(){
for(int i=0;i<100;i++){
User user=new User();
user.setId(i);
user.setName("瓜田李下"+i);
user.setAge(i%10+15);
userService.save(user);
}
return "success";
}
@RequestMapping("/update")
public String update(){
Query query=new Query(Criteria.where("id").lte(10));
System.out.println("更新数据前为:");
mongoTemplate.find(query,User.class).forEach(System.out::println);
for (int i=0;i<=10;i++){
try{
userService.updateById(i);
}catch (Exception e){
System.out.println(e.getMessage());
}
}
System.out.println("更新后数据为:");
mongoTemplate.find(query,User.class).forEach(System.out::println);
return "success";
}
@RequestMapping("/deleteAll")
public String deleteAll(){
mongoTemplate.findAllAndRemove(new Query(),User.class);
return "success";
}
}
***************************
控制台输出