springboot与mongodb之事务管理
一、事务说明
1、在4.0版本中,MongoDB支持副本集上的多文档事务,分片集群是不支持事务的,会报以下异常
Transactions are not supported by the MongoDB cluster to which this client is connected
2、在版本4.2中,MongoDB引入了分布式事务,在副本集或分片集群上都是支持事务的。
3、事务是建立在已存在集合上的,所以不支持事务内创建集合。
二、事务配置
1、新建配置类
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.MongoTransactionManager;
/**
* mongodb配置类
*
*/
@Configuration
@Slf4j
public class MongodbConfig {
/**
* mongodb事务配置
*
* @param factory 工厂
* @return 事务管理器
*/
@Bean
public MongoTransactionManager transactionManager(MongoDatabaseFactory factory) {
return new MongoTransactionManager(factory);
}
}
2、在需要开启事务的方法上使用@Transactional注解就可以了。
3、若同时使用mysql,mysql事务会失效
三、与mysql事务同时使用
1、新建配置类,同时创建两个事务管理器
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.MongoTransactionManager;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* 事务配置类*/
@Configuration
@Slf4j
public class TransactionConfig {
/**
* mongodb事务配置
*
* @param factory 工厂
* @return 事务管理器
*/
@Bean("mongoTransactionManager")
public MongoTransactionManager transactionManager(MongoDatabaseFactory factory) {
return new MongoTransactionManager(factory);
}
/**
* mysql事务管理器
*
* @param dataSource 数据源
* @return 事务管理器
*/
@Bean
@Primary
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
2、需要用到mysql事务则在方法上添加注解@Transactional
@Transactional(rollbackFor = Exception.class)
public void save(Vo vo) {
}
3、需要用到mongodb事务则在方法上添加注解@Transactional(transactionManager = “mongoTransactionManager”)
@Transactional(transactionManager = "mongoTransactionManager")
public void save(Vo vo) {
}

