知識庫 / Spring RSS 訂閱

事務註解:Spring 框架 vs. JTA

Persistence,Spring
HongKong
4
12:57 PM · Dec 06 ,2025

1. 概述

本教程將討論 <strong >org.springframework.transaction.annotation.Transactional</strong><em >javax.transaction.Transactional</em> 註解之間的差異。

我們將首先介紹它們的配置屬性。然後,我們將討論每個註解可以應用於哪些類型的組件,以及在什麼情況下我們應該使用其中之一。

2. 配置差異

Spring 的 <em Transactional</em> 註解與它的 JTA 對標版本相比,具有額外的配置要求:

  • 隔離 – Spring 通過 `` 屬性提供事務級別的隔離;但在 JTA 中,該功能僅在連接級別可用。
  • 傳播 – 在兩個庫中都可用,通過 Spring 中的 `` 屬性和 Java EE 中的 `` 屬性實現。Spring 提供了 `` 作為額外的傳播類型。
  • 只讀 – 僅在 Spring 中通過 `` 屬性提供。
  • 超時 – 僅在 Spring 中通過 `` 屬性提供。
  • 回滾 – 兩個註解都提供回滾管理功能;JTA 提供 `` 和 `` 屬性,而 Spring 則有 `` 和 `` 屬性,以及兩個額外的屬性:`` 和 ``。

2.1. Spring Transactional 註解配置

以下以示例説明如何使用和配置 Spring 的 Transactional 註解,應用於一個簡單的汽車服務:

import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(
  isolation = Isolation.READ_COMMITTED, 
  propagation = Propagation.SUPPORTS, 
  readOnly = false, 
  timeout = 30)
public class CarService {

    @Autowired
    private CarRepository carRepository;

    @Transactional(
      rollbackFor = IllegalArgumentException.class, 
      noRollbackFor = EntityExistsException.class,
      rollbackForClassName = "IllegalArgumentException", 
      noRollbackForClassName = "EntityExistsException")
    public Car save(Car car) {
        return carRepository.save(car);
    }
}

2.3. JTA 事務性註解配置

讓我們以一個簡單的租賃服務為例,使用 JTA 事務性註解:

import javax.transaction.Transactional;

@Service
@Transactional(Transactional.TxType.SUPPORTS)
public class RentalService {

    @Autowired
    private CarRepository carRepository;

    @Transactional(
      rollbackOn = IllegalArgumentException.class, 
      dontRollbackOn = EntityExistsException.class)
    public Car rent(Car car) {
        return carRepository.save(car);
    }
}

3. 可用性和互換性

JTA <em Transactional</em>> 註解適用於由 Java EE 規範管理定義的 CDI 管理的 Bean 和類,而 Spring 的 <em Transactional</em>> 註解僅適用於 Spring Bean。

此外,JTA 1.2 的支持已在 Spring Framework 4.0 中引入。因此,<strong we can use the JTA <em Transactional</em>> annotation in Spring applications</strong>。但是,反過來則不可,因為我們不能在 Spring 上下文中之外使用 Spring 註解。

4. 結論

在本教程中,我們討論了 Spring 和 JTA 事務性註解之間的差異,以及何時使用哪種註解。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.