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) { }