トランザクションアノテーション:Springvs.JTA
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から入手できます。