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 事務性註解之間的差異,以及何時使用哪種註解。