Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Formoat's Open Blog

Transaction - 트랜잭션 본문

Java/Spring

Transaction - 트랜잭션

snd-snd 2019. 10. 8. 14:16

# Transaction

 

데이터베이스의 상태를 변경시키는 기능을 수행하기 위한 작업의 단위로 데이터베이스의 상태를 변경시키는

일련의 작업들이 있을 때 이러한 작업들은 모두 에러가 없이 끝나야 한다. 만약 중간에 에러가 발생 했다면,

일련의 작업들 모두 이전 내용으로 원상복구(Rollback) 되어야 한다. 이렇듯 데이터에 대해 무결성을 유지하기

위한 처리 방법을 '트랜잭션 처리'라고 한다.

 

대표적인 트랜잭션의 예로 '계좌이체'가 있다. (출금/입금이 한몸으로 움직이는 상태)

 

  • Commit : 트랜잭션으로 묶인 모든 쿼리가 성공적으로 동작하면 쿼리 결과를 데이터베이스에 실제로 반영
  • Rollback : 트랜잭션으로 묶인 쿼리 중 하나라도 실패하면, 전체 쿼리를 실패로 간주해 실패 이전 실행한 쿼리 모두 취소

 


# 스프링의 트랜잭션 처리 방법 (AOP 이용 선언적 트랜잭션 처리)

 

 

1) XML 설정파일을 이용한 방법

  • <tx:advice> : 트랜잭션 적용시 사용될 Advisor를 설정
  • <tx:attributes> : ...
  • <tx:method> : 트랜잭션을 적용할 메서드 및 트랜잭션 속성 설정

 

 

Property Default Description
Name ... 트랜잭션이 적용될 메서드 이름을 명시 ('*'을 이용해 생략문 가능)
propagation REQUIRED 트랜잭션 전파 규칙 설정
Isolation DB 기본설정값 트랜잭션 격리 레벨 설정
readOnly false 읽기 전용 여부 설정
no-rollbackFor ... 트랜잭션을 롤백하지 않을 예외 지정
rollbackFor ... 트랜잭션을 롤백할 예외 지정 // ex) rollbackFor={Exception.class}
timeout -1 트랜잭션의 타임아웃 시간을 초 단위로 지정

 

 

※ rollback-for 속성과 no-rollback-for 속성에 대한 주의

 

스프링 트랜잭션의 경우 RuntimeException Error 발생시에만 롤백을 하고, Throwable, Exception

타입의 예외 발생시에는 롤백을 하지 않는데, 이를 설정하고 싶을 때 또는 특정 타입의 예외 발생시에도

롤백을 하지 않으려 할 때에 사용된다.

 

 

 

2) @Transactional 어노테이션 사용

  • 트랜잭션 관리자 설정
  • 트랜잭션 설정은 직접 코드에 어노테이션을 추가
  • 어노테이션 활성화 코드 삽입

 

<tx:annotation-driven> 태그 옵션

 

- transaction-manager : 사용할 PlatformTransactionManager 빈의 이름 (default : transactionManager)

- proxy-target-class : 클래스에 대해 프록시를 생성할 것인지 여부 (default : false)

- order : Advice 적용 순서 (default : int의 최대값 // 가장 낮은 순위)

 

 

Property Default Description
propagation Propagation.REQUIRED 트랜잭션 전파 규칙 설정
Isolation DB 기본설정값 트랜잭션 격리 레벨 설정
readOnly false 읽기 전용 여부 설정
no-rollbackFor ... 트랜잭션을 롤백하지 않을 예외 지정
rollbackFor ... 트랜잭션을 롤백할 예외 지정 // ex) rollbackFor={Exception.class}
timeout -1 트랜잭션의 타임아웃 시간을 초 단위로 지정

 

 

@Transaction 어노테이션 속성 활용 예

@Transactional(
		propagation = Propagation.REQUIRED,
		isolation = Isolation.READ_COMMITTED,
		readOnly = false,
		timeout = 10,
		rollbackFor = {Exception.class, NullPointerException.class}
)
@Override
public void addData(String data) {
	mapper.insert_sample1(data);
	mapper.insert_sample2(data);	
}
Comments