Spring boot-サービス抽象

13236 ワード

5サービス抽象


オブジェクト:分割できない単位.(原子性)

5.2.2取引境界の設定


SQLビームを処理するとき、DBはトランザクションを保証します.
ただし、2つのSQLを1つのトランザクションに自動的にマージすることはありません.

JDBCトランザクションのトランザクション境界の設定


トランザクションの開始と終了の場所をトランザクション境界と呼びます.
Connection c = dataSource.getConnection();

c.setAutoCommit(false);

try{
 PreparedStatement st1= c.preparedStatement("update .... ");
 st1.excuteUpdate();
 
 PreparedStatement st2= c.preparedStatement("delete .... ");
  st2.excuteUpdate();
  
  c.commit();
  }
  catch(Exception e){
  	c.rollback();
   }
   c.close();
}
トランザクションの開始と終了は、接続を取得して閉じる間に発生します.
settAutoCommit(false)でトランザクションの開始を宣言し、commit()またはrollback()でトランザクションを終了する操作をトランザクションの境界設定と呼びます.
このようなDB接続で作成されたトランザクションをローカルトランザクションと呼びます.

トランザクションの同期


:ユーザー・サービスのトランザクションを開始するために作成された接続オブジェクトを特殊なリポジトリに保存し、後で呼び出されるDAOメソッドで保存された接続を使用します.

1)ユーザー・サービスは接続を作成し、2)トランザクションが同期されたリポジトリに保存され、接続されたsettAutoCommit(false)を呼び出してトランザクションを開始し、DAOの機能の正式な使用を開始します.3)最初のupdate()メソッドを呼び出します.updateメソッド内で使用されるjdbcTemplateメソッドレジストリは、現在開始されているトランザクションのConnectionオブジェクトが書き込まれているかどうかをトランザクション同期リポジトリで最初に検証します.
上記の方法では、コネクタオブジェクトをパラメータで1つずつ渡す必要があります.

トランザクションの同期の適用


マルチスレッド環境で安全なトランザクション同期を実現する方法は簡単ではありません.幸いなことに、springはjdbctemplateとともに、このトランザクション同期機能をサポートする簡単なユーティリティ方法を提供しています.
public void upgradeLevels() throws SQLException {
        // 트랜잭션 동기화 관리자를 이용해 동기화 작업을 초기화한다.
        TransactionSynchronizationManager.initSynchronization();

		// DataSourceUtils을 사용하는 이유는 커넥션 오브젝트의 생성과 트랜잭션 동기화에 사용하다록, 저장소에 바인딩 해주기 ㄸ문.
        Connection c= DataSourceUtils.getConnection(dataSource);
        c.setAutoCommit(false);

        try{
            List<User> users = dao.getAll();
            for(User user : users){
              if(canUpgradeLevel(user))
                  upgradeLevel(user);
            }
            c.commit();
        }catch (Exception e){
            c.rollback();
            throw  e;
        }
        finally {
            DataSourceUtils.releaseConnection(c,dataSource);
            TransactionSynchronizationManager.unbindResource(this.dataSource);
            TransactionSynchronizationManager.clearSynchronization();
        }
    }

グローバルトランザクション


複数のDBを処理するには、グローバルトランザクションを使用する必要があります.
API、Java Transaction APIを提供し、グローバルトランザクションをサポートするトランザクションマネージャをサポートします.
JTAを使用すると、トランザクション管理では、複数のデータベースまたはメッセージ・サーバ上のタスクを1つのトランザクションの分散トランザクションまたはグローバルトランザクションにマージできます.
Springが提供するトランザクション境界を設定するための抽象インタフェースはPlatformTransaction Managerです.
ローカルトランザクションを使用する場合は、PlatformTransaction Managerを実装するDataSourceTransaction Managerを使用できます.
public void upgradeLevels() throws SQLException {
        // JDBC 트랜잭션 추상 오브젝트 생성
        PlatformTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);

        TransactionStatus status=  transactionManager.getTransaction(new DefaultTransactionDefinition());

        try{
            List<User> users = userDao.getAll();
            for(User user : users){
              if(canUpgradeLevel(user))
                  upgradeLevel(user);
            }
            transactionManager.commit(status);
        }catch (Exception e){
            transactionManager.rollback(status);
            throw  e;
        }
    }
上記のコードをローカル・トランザクションからグローバル・トランザクションに変更するには、次の手順に従います.
    PlatformTransactionManager transactionManager = new JTATransactionManager(dataSource); 
成果を変えればいい.