Jeonguk Lee

I am java developer.

Transaction Management in Spring

06 Feb 2018 » spring, java, database

Transaction Management in Spring

  • 트랜잭션은 모든 작업을 실행해야하거나 실행하지 않아야하는 작업 단위입니다.
  • 거래의 중요성을 이해하려면 우리 모두에게 적용되는 예를 생각하십시오. “한 계정에서 다른 계정으로 금액 이전”-이 작업에는 적어도 두 단계 아래에 포함됩니다
    • 발신자의 계좌에서 잔액 차감
    • 금액을 수신자의 계정에 추가
  • 이제 금액이 발신자의 계정에서 차감되지만 일부 오류로 인해 수신자 계좌로 전달되지 않는 상황을 생각해보십시오. 이러한 문제는 두 단계 모두가 성공적으로 수행되는 단일 작업 단위로 두 단계가 수행되는 트랜잭션 관리에 의해 관리되거나 실패한 사람이있는 경우 롤백해야합니다.
  • 이해하는 데 중요한 4 가지 중요한 용어가 있습니다.
    • Atomic(원자성) - 위에서 설명했듯이 원자성은 트랜잭션 내의 모든 조작이 성공해야하거나 전혀 작동하지 않아야 함을 확인합니다.
    • Consistent(일관성) -이 특성은 트랜잭션이 완료되면 데이터가 일관성있는 상태에 있어야합니다.
    • Isolated(격리) -이 속성을 사용하면 여러 사용자가 동일한 데이터 집합에 액세스 할 수 있으며 각 사용자의 처리는 다른 데이터 집합과 격리되어야합니다.
    • Durable(내구성) - 일단 데이터가 손실되지 않도록 트랜잭션이 완료되면 트랜잭션 결과가 영구적이어야합니다.

Spring Transaction Management Support

  • Spring은 EJB와 비슷한 프로그래밍 방식의 선언적 트랜잭션을 지원.
    • 프로그래밍 방식의 트랜잭션 (Programmatic Transactions) - 프로그래밍 방식의 트랜잭션을 사용하면 모든 것이 성공했을 때 커밋하거나 잘못되었을 때 롤백하는 등의 트랜잭션 관리 코드를 비즈니스 로직과 함께 사용할 수 있습니다.
    • 선언적 트랜잭션 (Declarative Transactions) - 선언적 트랜잭션은 트랜잭션 관리 코드를 비즈니스 논리와 분리합니다. Spring은 트랜잭션 조언 (AOP 사용)을 사용하여 선언적 트랜잭션을 지원한다.
  • 선언적 또는 프로그래밍 방식 트랜잭션을 선택하는 것은 편의성 vs 미세 제어입니다. 프로그래밍 방식은 트랜잭션 경계를 정밀하게 제어 할 수있는 반면 선언적 방식은 구성 파일을 사용하여 뛰어난 구성 가능성을 제공합니다.
  • 응용 프로그램이 하나의 데이터 소스로 작업하는 경우에만 트랜잭션 객체의 커밋 및 롤백 메소드를 사용하여 트랜잭션을 관리 할 수 ​​있지만 J2EE 서버가 제공하는 트랜잭션 관리에 의존해야하는 여러 데이터 소스간에 트랜잭션을 수행 할 수 있습니다. Spring은 나중의 경우에 사용할 수있는 분산 (XA) 트랜잭션도 지원합니다.

Choosing Transaction Manager

  • 트랜잭션을 관리하는 대신 Spring은 트랜잭션 관리 책임을 플랫폼 특정 구현에 위임하는 여러 트랜잭션 관리자를 지원합니다. Plarform Transaction manager는 모든 트랜잭션 관리자 구현의 부모입니다.
  • 트랜잭션 관리자 중 일부는 다음과 같습니다.
    • DataSource Transaction manager - 간단한 JDBC persistence mechanism 을 위해 DataSourceTransactionManager를 사용할 수 있습니다. DataSourceTransactionManager의 샘플 구성은 다음과 같습니다 ```

<bean id=”transactionManager” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager> <property name=”dataSource” ref= “datasource” /> </bean>

  - Hibernate Transaction manager - 응용 프로그램이 Hibernate를 사용할 때 Hibernate 트랜잭션 관리자가 사용되어야한다. HibernateTransactionManager의 샘플 구성은 다음과 같습니다

<bean id=”transactionManager” class=”org.springframework.orm.hibernate3.HibernateTransactionManager> <property name=”sessionFactory” ref= “sessionFactory” /> </bean>

  - Jdo Transaction manager - 아래 구성을 사용하여 Java 데이터 객체 트랜잭션 관리자를 사용.

<bean id=”transactionManager” class=”org.springframework.orm.jdo.JdoTransactionManager> <property name=”persistanceManagerFactory” ref= “persistanceManagerFactory” /> </bean>

  - Jta Transaction manager - Google Transactions가 Java Transactions API 트랜잭션을 사용해야하는 것보다 여러 데이터 소스에 걸쳐있는 경우. 내부적으로 JTA 구현은 트랜잭션 책임을 처리합니다.
  - 아래의 설정을 사용하여 JTA 트랜잭션 관리자를 설정.

<bean id=”transactionManager” class=”org.springframework.transaction.jta.JtaTransactionManager> <property name=”transactonManagerName” ref= “java:/TransactionManager” /> </bean> ```

Programmatic Transaction Management

  • Spring은 org. springframework.transaction package 에서 PlatformTransactionManager 인터페이스로 알려진 추상 트랜잭션 관리 단위의 도움으로 플랫폼 독립적 인 트랜잭션 관리자 API를 제공합니다.
  • 이 인터페이스는 아래의 메소드를 정의합니다.
    • getTransaction(TransactionDefinition) - 이 메소드는 트랜잭션 (활성 트랜잭션 또는 새 트랜잭션 생성)을 리턴합니다.
    • void commit(TransactionStatus) - 이 메소드는 상태를 기반으로 트랜잭션을 커밋합니다.
    • void rollback(TransactionStatus) - 이 메소드는 상태를 기반으로 트랜잭션을 롤백합니다.
  • TransactionStatus 인터페이스는 트랜잭션 상태를 가져 오는 여러 가지 메소드를 정의하고 트랜잭션 실행을 제어합니다.