Spring Boot注解@Transactional结合实际例子讲解

在今天的文章中,我们将学习 Spring Boot @Transactional 中使用的最重要注释之一的基础知识。

理解springboot中使用@Transactional进行事务管理:

  • 事务注释用于管理 spring-boot 应用程序中的事务。
  • 该注释可以在类级别或方法级别使用。
  • 在企业管理的应用程序中,用户或应用程序为执行单个操作而采取的操作序列称为事务。
  • @Transaction 注释通过提供声明性方法来简化事务管理。
  • 开发人员可以专注于业务逻辑,框架负责事务管理。

例子
考虑到我们在将报价数据保存到数据库时有两个表,offer 和 Offer_criteria,因此保存 Offer_criteria 信息也至关重要。

package com.example.offerManagement.service;

import com.example.offerManagement.entity.OfferCriteria;
import com.example.offerManagement.model.Offer;
import com.example.offerManagement.repository.OfferCriteriaRepository;
import com.example.offerManagement.repository.OfferRepository;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
public class OfferServiceImpl implements OfferService{

    @Autowired
    OfferRepository offerRepository;

    @Autowired
    OfferCriteriaRepository offerCriteriaRepository;

    @Override
    @Transactional
    public void saveOffer(Offer offer) {
            ObjectMapper objectMapper = new ObjectMapper();
            com.example.offerManagement.entity.Offer offerEntity = objectMapper.convertValue(offer, com.example.offerManagement.entity.Offer.class);
            offerRepository.save(offerEntity);
            List<OfferCriteria> offerCriteriaList = new ArrayList<>();
            for(OfferCriteria offerCriteria : offer.getOfferCriteria()){
                offerCriteria.setOffer(offerEntity);
                offerCriteriaList.add(offerCriteria);
            }

            offerCriteriaRepository.saveAll(offerCriteriaList);
    }
}

在上例中,如果在 offerRepository.save(offerEntity) 行之后的代码中出现异常,那么已经完成的保存 offerEntity 的事务将回滚,数据库将处于一致状态。

如果我们在不使用 @Transactional 注解的情况下运行此程序,如果在 offerRepository.save(offerEntity) 行之后出现异常,数据将保存在要约表中,但不会保存在要约标准表中。

注:对于 2.0 以下的 Spring 版本,我们必须在 Spring boot 应用程序的主类中添加 @EnableTransactionManagement 注解,才能使用 @Transactional 来使用 Spring 提供的事务管理。

@SpringBootApplication
@EnableTransactionManagement
public class OfferManagementApplication {

 public static void main(String[] args) {
  SpringApplication.run(OfferManagementApplication.class, args);
 }

}

事务注解 @ 的关键属性:

  • Propogation 传播 - 定义事务的传播行为
  • Isolation隔离--指定事务的隔离级别
  • ReadOnly只读--将事务标记为只读
  • TimeOut超时- 设置事务的时间限制
  • RollbackFor & NoRollbackFor - 分别指定触发回滚或不触发回滚的异常。

希望这能帮助你理解事务注解,以及在单个事务中处理多个数据库调用时使用它的意义。