springboot与mongodb之事务管理

作者: adm 分类: java 发布时间: 2023-12-24

一、事务说明
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) {
    }

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!