spring data mongodb 如何以事物的方式进行增删改查

在Spring Data MongoDB中使用事务(transactions)来进行增删改查操作可以确保这些操作要么全部成功,要么全部失败,从而保证数据的一致性。以下是使用Spring Data MongoDB事务的一些关键步骤和示例:

前提条件

  1. MongoDB版本:确保你使用的MongoDB版本为4.0或更高,因为事务支持是从4.0版本开始引入的。
  2. 副本集:事务只能在副本集(Replica Set)或分片集群(Sharded Cluster)上使用,不能在单节点MongoDB实例上使用。

配置Spring Boot项目

确保在你的Spring Boot项目中引入了spring-boot-starter-data-mongodb依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

配置MongoDB事务管理器

在Spring Boot项目中,配置MongoDB事务管理器通常在配置类中完成:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.MongoTransactionManager;

@Configuration
public class MongoConfig {

    @Bean
    MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
        return new MongoTransactionManager(dbFactory);
    }
}

使用事务进行增删改查

使用Spring的@Transactional注解来管理事务。在你的服务类中,注入你需要的Repository,然后在带有@Transactional注解的方法中进行增删改查操作。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    @Autowired
    private MongoTemplate mongoTemplate;

    @Transactional
    public void performTransaction() {
        // 插入操作
        MyDocument doc1 = new MyDocument("doc1");
        myRepository.save(doc1);

        // 更新操作
        MyDocument doc2 = myRepository.findById("doc2Id").orElseThrow(() -> new RuntimeException("Document not found"));
        doc2.setName("updatedName");
        myRepository.save(doc2);

        // 删除操作
        myRepository.deleteById("doc3Id");

        // 查询操作
        MyDocument doc4 = myRepository.findById("doc4Id").orElseThrow(() -> new RuntimeException("Document not found"));
        System.out.println("Retrieved Document: " + doc4);
    }
}

Repository接口

定义你的Repository接口:

import org.springframework.data.mongodb.repository.MongoRepository;

public interface MyRepository extends MongoRepository<MyDocument, String> {
}

文档类

定义你的文档类:

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "my_collection")
public class MyDocument {

    @Id
    private String id;
    private String name;

    // 构造函数、getter和setter
    public MyDocument(String name) {
        this.name = name;
    }

    // getter和setter
}

事务回滚

当事务中的任何操作抛出异常时,事务将回滚。你可以通过自定义异常来触发回滚:

import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    @Transactional(rollbackFor = CustomException.class)
    public void performTransaction() throws CustomException {
        // 事务操作
        try {
            // 插入操作
            MyDocument doc1 = new MyDocument("doc1");
            myRepository.save(doc1);

            // 更新操作
            MyDocument doc2 = myRepository.findById("doc2Id").orElseThrow(() -> new RuntimeException("Document not found"));
            doc2.setName("updatedName");
            myRepository.save(doc2);

            // 删除操作
            myRepository.deleteById("doc3Id");

            // 模拟异常
            if (true) {
                throw new CustomException("Custom Exception Occurred");
            }

        } catch (Exception e) {
            throw new CustomException("Exception during transaction", e);
        }
    }
}
public class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, Throwable cause) {
        super(message, cause);
    }
}

完。

posted @ 2024-07-17 00:27  gongchengship  阅读(2)  评论(0编辑  收藏  举报