新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。もう新人じゃないかも…

学習記録:Spring

[学習記録] Spring

内容 第5章:ビジネスロジック層の設計と実装

Webアプリケーションのトランザクション
  • 複数のリクエストにまたがるトランザクション
    • 滞在先のホテルを予約し、その後航空チケットを予約
    • ホテルを予約後、フライトを検索したら全て満席で航空チケットの予約ができない場合
    • ホテルの予約は自動的にキャンセル || ユーザにホテルのキャンセルを促す || 別の移動手段を提示する
    • このようなトランザクションを「ロングトランザクション」「疎結合トランザクション」という
    • アプリケーションの設計や、場合によってはシステムの運用で対応
トランザクションマネージャ
  • Springが提供するトランザクション処理を行うための部品
    • コミット等の処理をはじめ、トランザクションの定義情報(独立性レベルなど)を細かく設定可能
    • データアクセス技術を隠蔽
  • トランザクションマネージャの実装クラス
    • 共通のインタフェースとしてPlatformTransactionManagerが存在
    • 実装クラスとしては[DataSource, Hibernate, Jpa, Jdo, Jta]TransactionManagerが存在
    • 使用するデータアクセス技術に合わせて適切な実装クラスをBean定義ファイルに記述
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
トランザクション機能の使い方
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="get*" read-only="true" />
        <tx:method name="update*"
              propagation="REQUIRED"
              isolation="READ_COMMITED"
              timeout="10"
              read-only="false"
              rollback-for="sample.business.service.exception.BusinessException" />
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:advisor advice-ref="transactionAdvice"
        pointcut="execution(* sample.business.service.*Service.*(. .))" />
</aop:config>
@Transactional
public class HogeServiceImpl {

    @Transactinal(
        propagation=Propagation.REQUIRED,
        isolation=Isolation.READ_COMMITED,
        timeout=10, readOnly=false,
        rollbackFor="BusinessException.Class" )
    public class update(Hoge hoge) throws BusinessException {
        ...
    }
}
    • Bean定義ファイルで@Transactionalを有効に設定
<tx:annotation-driven transaction-manager="transactionManager" />
@Autowired
private PlatformTransactionManager txManager;

public void update(Hoge hoge) {
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    ...
    TransactionStatus status = txManager.getTransaction(def);
    try {
        // ビジネスロジック
    } catch (RuntimeException e) {
        txManager.rollback(status);
    }
    txManager.commit(status);
}