文章19 | 阅读 10065 | 点赞0
MongoDB4.0的出现被认为是业界最好的处理事务的文档类型的非关系型的数据库。单节点mongo是不支持事务的。MongoDB单机方式运行不支持事务,需要把单机转为只有一个实例的副本集。
MongoDB4.0保留了对数据库事务的支持。并且还支持跨文档的事务的支持。就是在同一个事务中可以支持对多个文档的操作。这个特点对于业务逻辑比较复杂的需求,可以很大程度的降低代码的复杂度。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
uri: 要配置主节点的信息,replicaSet表示副本集名称。
注意:Spring Boot集成MongoDB事务 必须要使用MongoDB副本集,单节点是不支持事务的。
spring:
data:
mongodb:
uri: mongodb://mongo:123456@localhost:27000,localhost:27001/test?connect=replicaSet&replicaSet=rs
# host: localhost
# port: 27017
# database: test
# username: mongo
# password: '123456'
mongodb://[username:password@]host1[:port1][,host2[:port2]] [/[database][?options]]
@Configuration
public class TransactionConfig {
@Bean
public MongoTransactionManager transactionManager(MongoDatabaseFactory factory){
return new MongoTransactionManager(factory);
}
}
注意:方法上需要使用事务注解 @Transactional。
@Service
public class UserService {
@Autowired
private MongoTemplate mongoTemplate;
@Transactional
public void testMongoDBTransactional() {
Address shanghai = new Address("shanghai", "pudong");
Address beijing = new Address("beijing", "chaoyang");
mongoTemplate.save(shanghai, "address");
System.out.println(1/0);
mongoTemplate.save(beijing, "address");
}
}
@SpringBootTest
@RunWith(SpringRunner.class)
class SpringbootMongodbApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private UserService userService;
@Test
void testMongoDBTransactional() {
userService.testMongoDBTransactional();
}
}
读写分离需要配置slaveOk=true。
spring:
data:
mongodb:
uri: mongodb://mongo:123456@localhost:27000,localhost:27001/test?connect=replicaSet&slaveOk=true&replicaSet=rs
事务的读操作必须在主节点上,所以事务不能进行读写分离。同时开启读写分离又使用事务,事务中涉及到读操作就会报错“Read preference in a transaction must be primary”。
@Service
public class UserService {
@Autowired
private MongoTemplate mongoTemplate;
// @Transactional
public void testMongoDBTransactional() {
Address shanghai = new Address("shanghai", "pudong");
Address beijing = new Address("beijing", "chaoyang");
mongoTemplate.save(shanghai, "address");
mongoTemplate.save(beijing, "address");
List<Address> all = mongoTemplate.findAll(Address.class);
System.out.println(all);
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://monday.blog.csdn.net/article/details/115693765
内容来源于网络,如有侵权,请联系作者删除!