1. 概要

このチュートリアルでは、org.springframework.transaction.annotation.Transactionalアノテーションとjavax.transaction.Transactionalアノテーションの違いについて説明します。

まず、それらの構成プロパティの概要から始めます。 次に、それぞれに適用できるコンポーネントのタイプと、どちらを使用できるかについて説明します。

2. 構成の違い

SpringのTransactionalアノテーションには、対応するJTAと比較して追加の構成が付属しています。

  • 分離– Springは、分離プロパティを介してトランザクションスコープの分離を提供します。 ただし、JTAでは、この機能は接続レベルでのみ使用できます
  • Propagation –Springのpropagation プロパティ、およびJavaEEのvalue プロパティを介して、両方のライブラリで使用できます。 Springは、追加の伝播タイプとしてネストされたを提供します
  • 読み取り専用– readOnlyプロパティを介してSpringでのみ使用可能
  • タイムアウト– timeoutプロパティを介してSpringでのみ使用可能
  • ロールバック–両方の注釈がロールバック管理を提供します。 JTAはrollbackOnおよびdontRollbackOnプロパティを提供し、SpringにはrollbackForおよびnoRollbackForに加えて、rollbackForClassNameという2つの追加プロパティがあります。 ]およびnoRollbackForClassName

2.1. Springトランザクション注釈構成

例として、単純な自動車サービスで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 Transactional アノテーションを使用して、単純なレンタルサービスについても同じことを行いましょう。

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 Transactional アノテーションは、CDI管理対象BeanおよびJava EE仕様によって管理対象Beanとして定義されたクラスに適用されますが、SpringのTransactionalアノテーションはSpringBeanにのみ適用されます。 。

JTA1.2のサポートがSpringFramework4.0で導入されたことも注目に値します。 したがって、SpringアプリケーションでJTATransactionalアノテーションを使用できます。 ただし、Springコンテキストの外部でSpringアノテーションを使用することはできないため、その逆は不可能です。

4. 結論

このチュートリアルでは、SpringとJTAの Transactional アノテーションの違いと、どちらを使用できるかについて説明しました。

いつものように、このチュートリアルのコードはGitHubから入手できます。