두 손끝의 창조자

Spring Transaction Management 본문

프로그래밍언어/Java

Spring Transaction Management

codinglog 2017. 7. 11. 08:51
  1. 핵심 Interface
    1. PlatformTransactionManager
      1. getTransaction()
      2. commit()
      3. rollback()
    2. TransactionDefinition
      1. 트랜잭션 4가지 속성
  2. 구현체
    1. DataSourceTransactionManager
      1. TransactionAPI 이용해서 관리
      2. 트랜잭션을 적용할 datasource 빈으로 등록되어 있어야
      3. JDBC SqlMap으로 만든 DAO 적용가능함
      4. 트랜잭션을 적용할 DAO 사용하는 것과 동일한 datasource 빈으로 제공해야
      1. Datasource getConnection() 호출될때마다 매번 새로운 Connection 돌려줘야
        1. ThreadLocal 등을 이용해 트랜잭션을 저장해두고 돌려주는 특별한 기능을 가진 DataSource 사용하면 안됨
      1. 애플리케이션 코드에서 트랜잭션 매니저가 관리하는 Connection 가져오려면 DataSourceUtils.getConnection(DataSource) 사용해야
        1. JDBCTemplate 내부에서 현재 진행중인 트랜잭션을 가져올 메소드를
        2. DAO 밖에서 현재 Connection 가져와서 참조해야 경우만 주의해서 사용할
      2. JDBC Template 사용하지 않는 레거시 DAO에서 트랜잭션 매니저와 연동하려면
        1. 레거시 DAO getConnection DataSourceUtils.getConnection(DataSource) 모두 변경
        2. DAO DataSource 사잉에 TransactionAwareDataSourceProxy 넣ㅇ어서 DAO에서 getConnection 해도 현재 트랜잭션의 커넥션을 가져오게 있음
      3. 제한
        1. 서버가 제공하는 DataSource 트랜잭션 서비스를 JNDI 접근해야 한다면 사용할 없음
          1. JTA 지원하는 스프링 트랜잭션 매니저를 이용
    2. JtaTransactionManager
      1. 하나 이상 DB 또는 트랜잭션 리소스가 참여하는 글로벌 트랜잭션을 적용해야
      2. 트랜잭션 서비스를 제공하는 WAS 이용하거나, 독립 JTA 서비스를 제공해주는 프레임워크를 사용해야
      3. DataSource 서버에 등록된 XA DataSource 사용해야
  3. DB 하나라면 트랜잭션 매니저도 하나만 등록돼야
    1. DB 여러 개라도 JTA 이용해 글로벌 트랜잭션을 적용 이라면 JtaTransactionManager 하나만 등록돼야
    2. , 이상의 DB 완전히 독립적으로 사용하는 경우는 이상 등록 있다.
      1. DataSource 이상
  4. 트랜잭션 경계설정 전략
    1. 일반적 경계 : 서비스 계층 오브젝트의 메소드
    2. 경계설정방법
      1. 코드에 의한
        1. 스프링의 트랜잭션 매니저는 모두 PlatformTransactionManager 구현하고 있음
          1. 현재 등록되어있는 트랜잭션 매니저 빈을 가져 있다면 트랜잭션 매니저의 종류에 상관없이 동일한 방식으로 트랜잭션을 제어하는 코드를 만들 있음
        2. PlatformTransactionManager 직접써도 되지만 try/catch 블록을 써야 하는 번거로움 있음
          1. TransactionTemplate 이용하면 편리
          2. 트랜잭션 기본 속성변경시 TransactionTemplate 만들 TransactionDefinition 오브젝트를 만들어서 파라미터로 제공
        3. 구현체 : DataSourceTransactionManager, JtaTransactionManager
        4. 실제로 많이 사용되지는 않지만 의도적으로 트랜잭션을 만들고 종료시키거나 여러 트랜잭션을 거치는 상황을 만들어야 하는 경우 유용함
        5. 현재 트랜잭션 확인 : getTransaction() TransactionStatus 오브젝트를 활용
      2. AOP 이용한 선언적 방법
        1. aop tx 네임스페이스
          1. aop tx 스키마의 태그 사용
          2. 어드바이스 : 트랜잭션 어드바이스
          3. pointcut : 대상선정, 인터페이스에 적용하는 것을 권장
          4. 서비스 게층의 메소드가 트랜잭션의 경계가 되는 것이 자연스러움
        2. @Transactional
          1. 설정파일에 명시적으로 포인트컷과 어드바이스를 정의하지 않음
          2. 타깃 인터페이스, 클래스, 메소드 등에 @Transactional 지정
          3. 필요 설정 : <tx:annotation-driven>
    3. AOP 방식의 한계점
      1. 클라이언트가 타깃 오브젝트로 위장한 프록시의 메소드를 호출 했을 때만 프록시를 거치기 때문에 정상적으로 동작함
        1. 만약 타깃 오브젝트가 자신의 메소드를 호출 때는 프록시를 거치기 않기 때문에 정상적으로 처리 되지 않음
        2. 해결 방법
          1. AopContext.currentProxy()
            1. 프록시에서 제공하는 API 호출
            2. 권장 안함
          2. AspenctJ AOP
  5. 트랜잭션 속성
    1. propagation
      1. 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법 결정
      2. 스프링에서 6가지를 지원하는데 모든 종류의 트랜잭션 매니저와 데이터 액세스 기술에서 지원하지 않으므로 주의
      3. 속성
        1. REQUIRED
          1. 모든 트랜잭션 매니저 지원
          2. 시작된 트랜잭션이 있으면 참여, 없으면 새로 시작
        2. SUPPORTS
          1. 시작된 트랜잭션이 있으면 참여, 없으면 없이 진행
        3. MANDATORY
          1. 시작된 트랜잭션이 있으면 참여, 없으면 예외
        4. REQUIRES_NEW
          1. 항상 트랜잭션
          2. 진행 중인 것이 있으면 것을 보류 시킴
        5. NOT_SUPPORTED
          1. 트랜잭션 사용 안함.
          2. 진행 중인 것은 보류
        6. NEVER
          1. 트랜잭션 사용 안함.
          2. 진행 중인 것이 있으면 예외
        7. NESTED
          1. 진행중인 것이 있으면 중첩 트랜잭션 시작
          2. 중첩된 것은 부모의 커밋 롤백에 영향을 받음
          3. 자신의 커밋과 롤백은 부모에 영향을 주지 않음
          4. JDBC 3.0 스펙의 저장포인트를 지원하는 드라이버와 DataSourceTransactionManager 이용할 경우에 적용 가능
          5. 중첩 트랜잭션을 지원하는 일부 WAS JTA 트랜잭션 매니저를 이용할 적용 가능
    2. isolation
      1. 동시에 여러 트랜잭션이 진행될 트랜잭션의 작업 결과를 어떻게 노출 시킬 것인지
      2. 속성
        1. DEFAULT
          1. 데이터 액세스 기술 또는 db 드라이버의 디폴트 설정 따름:보통 DB 격리수준을 따르는 것이 일반적
        2. READ_UNCOMMITTED
          1. 커밋 되기 전의 데이터가 다른 트랜잭션에도 노출됨
          2. 성능 극대화
        3. READ_COMMITTED
          1. 실제로 많이 사용됨
          2. 다른 트랜잭션이 커밋하지 않은 정보를 읽을 없음
          3. 다른 트랜잭션이 읽은 로우를 다른 트랜잭션이 수정 있음
        4. REPEATABLE_READ
          1. 하나의 트랜잭션이 읽은 로우를 다른 트랜잭션이 수정하는 것을 막음
          2. 새로운 로우 추가는 제한 안함
        5. SERIALIZABLE
          1. 트랜잭션을 순차적으로 진행시켜야 경우
          2. 여러 트랜잭션이 동시가 같은 테이블의 정보를 액세스 하지 못함
          3. 성능 떨어짐
    3. timeout
      1. 트랜잭션의 제한 시간, 초단위
      2. 디폴트를 시스템의 제한시간
    4. read-only, readOnly
      1. 트랜잭션을 읽기 전용으로 만듬
      2. 일부 트랜잭션 매니저는 읽기 전용 속성을 무시하고 수정할 있으므로 주의
    5. rollback-for, rollbackFor, rolbackForClassName
      1. 선언적 트랜잭션에서 런타임 예외 발생시 롤백
      2. 예외가 없거나 체크 예외 발생시 커밋
      3. 동작 방식을 바꾸고자
    6. no-rollback-for, noRollbackFor, noRollbackForClassName
      1. 기본적으로 롤백 대상인 런타임 예외를 트랜잭션 커밋 대상으로 지정
  6. 트랜잭션 통합
    1. DataSourceTransactionManager
      1. JDBC, iBatis 가지 기술을 함께 사용 있음
      2. 항상 동일한 DataSource 사용해야
    2. JtaTransactionManager
      1. JTA 서버 환경 구축, DataSource 구성이 필요
      2. 하나 이상의 DB 또는 JMS 같은 트랜잭션이 지원되는 서비스를 통합해서 하나의 트랜잭션으로 관리하고자 반드시 필요
  7. JdbcTemplate 사용 권장



출처 : 토비의 스프링3.1의 트랙잭션 파트를 요약 정리하였음

반응형
Comments