在今天的文章中,我们将学习 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 - 分别指定触发回滚或不触发回滚的异常。
希望这能帮助你理解事务注解,以及在单个事务中处理多个数据库调用时使用它的意义。