Knowledge

[Knowledge] Transaction이란? 속성

Jeong Jeon
반응형

1). 정의: 데이터베이스의 상태를 변환 시키는 하나의 논리적인 기능의 작업 단위이다. 데이터 베이스 관리 시스템이나 비슷한 시스템과 상호 작용하는 작업 단위.

 

2).트랜잭션의 성질

1. 일관성(Consistency) - 트랜잭션은 언제나 일관성 있는 데이터 베이스 상태를 유지하는 것을 의미.

2. 원자성(Atomicity) - 하나의 트랜잭션의 속한 작업들이 모두 실패인지 성공인지 보장을 의미 즉 하나로 간주

3. 고립성(lsolation) - 트랜잭션을 수행 시 다른 트랜잭션의 작업이 끼어들어들지 못하게 보장하는 것을 의미

4. 지속성(Durability) - 트랜잭션을 성공적으로 마치면 결과가 영원히 반영 되어야 하는걸 의미

 

3). 설정방법

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">   
<!-- 위에있는것은 트랜잭션을 쓰기위에 네임스페이스 설정 --> 
<!-- @Transactional 사용하기위한 커넥션 객체를 지정 --> 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource01"/> 
</bean>


<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

<tx:advice id="transactionAdvice" transaction-manager="transactionManager"> 
        <tx:attributes> 
            <tx:method name="get*" read-only="true" /> 
            <tx:method name="insert*" propagation="REQUIRED" /> 
            <tx:method name="update*" propagation="REQUIRED" /> 
            <tx:method name="delete*" propagation="REQUIRED"/> 
            <tx:method name="save*" propagation="REQUIRED"/> 
            <tx:method name="*" rollback-for="Exception"/> 
        </tx:attributes> 
</tx:advice> 

     
<!-- aop:pointcut 으로 tx:advice 정의하자  --> 
    <aop:config> 
        <aop:pointcut id="requiredTx" expression="execution(* com.java.controller..*service.*(..))"/> 
        <aop:advisor advice-ref="transactionAdvice" pointcut-ref="requiredTx" /> 
    </aop:config> 
</beans>

4). 속성

<tx:annotation-driven/> 속성

속성

디폴트

설명

transaction-manager

transactionManager

사용할 트랜잭션 관리자 이름이다. 위에 예제 처럼 트랜잭션 관리자의 이름이 디폴트와 다를경우에만 필요

mode

proxy

기본모드인 proxy가 Spring의 AOP프레임워크를 사용해서 프록시되는 어노테이션이 붙은 빈을 처리.

Aspectj는 스프링의 AspectJ 트랜잭션 관점으로 영향 받은 클래스를 대신 위빙해서 모든 종류의 메서드 호출에 적용하기 위해 대상 객체의 바이트 코드를 수정

proxy-target-class

false

트랜잭션 어노테이션이 붙은 클래스에 어떤 타입의 트랜잭션 프록시를 생성한것인지 제어한다. true면 클래스기반 프록시 false거나 설정 안했다면, JDK 인터페이스 기반 프록시

order

Ordered.LOWEST_PRECEDENCE

트랙잭션 어노테이션이 붙은 빈에 적용되는 트랜잭션 어드바이스 순서 정의

2. <tx:method/> 속성

<tx:advice id="transactionAdvice" transaction-manager="transactionManager"> 
        <tx:attributes> 
            <tx:method name="get*" read-only="true" /> 
            <tx:method name="insert*" propagation="REQUIRED" /> 
            <tx:method name="update*" propagation="REQUIRED" /> 
            <tx:method name="delete*" propagation="REQUIRED"/> 
            <tx:method name="save*" propagation="REQUIRED"/> 
            <tx:method name="*" rollback-for="Exception"/> 
        </tx:attributes> 
</tx:advice>
  • point과 advice-ref 속성값을 가진 별개의 aop:advisor 요소를 정의할 수 있다.
  • 트랜잭션의 기본설정을 쉽게 통괄하게 변경할 수 있다.
  • 한 코드내에 트랜잭션 설정 패키지와, 클래스,메소드를 알수있다.

속성

필수여부

디폴트

설명

name

y

 

연결된 트랜잭션 속성의 메소드 이름이다. 와일드카드(*) 문자로 공통부분의 문자가 들어가는 메소드에 사용할 수 있다. (ex get*, *service)

propagation

n

REQUIRED

트랜잭션 전파 동작

isolation

n

DEFAULT

트랜잭션 격리 수준

timeout

n

-1

트랜잭션 타임아웃 값 초단위다

read-only

n

false

트랜잭션 읽기 전용인지 아닌지

rollback-for

n

 

롤백을 일으키는 인젝션을 콤마로 구분한다.

no-rollback-for

n

 

롤백을 일으키지 않는 인젝션을 콤마로 구분한다

4-1).isolation

- DEFAULT -> 기본 격리수준(기본설정, DB의 isolation level을 따른다.)

- READ_UNCOMMITTED -> 커밋되지 않는 데이터에 대한 읽기를 허용

즉 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 B라는 아직 커밋이 되지 않은 데이터를 읽을 수 있게 하는 속성값 이다.

- READ_COMMITTED -> 트랜잭션이 커밋이 확정된 데이터만 읽기를 허용

- REPEATABLE_READ -> 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그영역에 해당 되는 데이터에 대한 수정이 불가능

- SERLALIZABLE -> 데이터의 일관성 및 동시성을 위해 MVCC(Multi Version Concurrency Control)을 사용하지 않는다.

 

 4-2).propagation

다른 트랜젹슨을 호출할 때 사용하는 속성

-REQULRED -> 이것은 이 속성의 디폴트 값이며, 부모 트랜잭션 안에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성

-SUPPORTS -> 이미실행된 트랜잭션이 있으면 참여 없으면 트랜잭션 없이 진행

-REQUIRES_NEW -> 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성

-MANDATORY -> REQULRED와 비슷하게 이미 시작된 트랜잭션있으면 참여 없으면 시작 하지 않고 예외를 던진다.(혼자서는 독립적으로 실행하면 안되는 경우에 종종 사용)

-NOT_SUPPORTED -> 트랜잭션을 사용하지 않게한다. 이미 진행 중인게 있으면 보류

 

5). 사용방법

  • 아래 1번과 같이 하나의 프로젝트에 여러 개의 '독립적인' 트랜잭션이 필요할 때 value 속성으로 이를 정의 할 수 있다

  • 아래 2번과 같이 속성을 정의하는 방식으로 사용할 수 있다.

 

1).

@Transactional("java")

public void javaService(String java) { }



2).

@Transactional(

propagation=Propagation.REQUIRED,

rollbackFor=Throwable.class)

public void javaService(String java) { }

 

반응형