Spring Boot註解@Transactional結合實際例子講解

banq發表於2024-03-11

在今天的文章中,我們將學習 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 - 分別指定觸發回滾或不觸發回滾的異常。

希望這能幫助你理解事務註解,以及在單個事務中處理多個資料庫呼叫時使用它的意義。

相關文章