在今天的文章中,我們將學習 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 - 分別指定觸發回滾或不觸發回滾的異常。
希望這能幫助你理解事務註解,以及在單個事務中處理多個資料庫呼叫時使用它的意義。