본문 바로가기
개발 공부 기록하기/- Spring

[Spring] @Transactional 에 관해

by soulduse 2016. 5. 18.

 

@Transactional을 이용한 선언적 트랜잭션

Configuration 설정

  • <tx:annotation-driven..>에 transactionManager를 설정하면 된다.
applicationContext-datasource.xml
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">     <property name="dataSource" ref="dataSource" /> </bean>  <tx:annotation-driven transaction-manager="transactionManager" /> 

@Transaction 속성

  • @Transactional에 속성을 정의하여 쓸 수 있는데 속성 목록은 아래와 같다.
속성 설 명 사용 예
isolation Transaction의 isolation Level. 별도로 정의하지 않으면 DB의 Isolation Level을 따름. @Transactional(isolation=Isolation.DEFAULT)
propagation 트랜잭션 전파규칙을 정의 , Default=REQURIED @Transactional(propagation=Propagation.REQUIRED)
readOnly 해당 Transaction을 읽기 전용 모드로 처리 (Default = false) @Transactional(readOnly = true)
rollbackFor 정의된 Exception에 대해서는 rollback을 수행 @Transactional(rollbackFor=Exception.class)
noRollbackFor 정의된 Exception에 대해서는 rollback을 수행하지 않음. @Transactional(noRollbackFor=Exception.class)
timeout 지정한 시간 내에 해당 메소드 수행이 완료되지 않은 경우 rollback 수행. 
-1일 경우 no timeout (Default = -1)
@Transactional(timeout=10)

Isolation Level (격리 레벨)

  • Transaction에서 일관성이 없는 데이터를 허용하도록 하는 수준이며, 여러 Transaction들이 다른 Transaction의 방해로부터 보호되는 정도를 나타낸다.
속성 설 명
ISOLATION_DEFAULT 데이터베이스에 의존
ISOLATION_READ_UNCOMMITTED 격리레벨중 가장 낮은 격리 레벨이다. 
다른 Commit되지 않은 트랜잭션에 의해 변경된 데이터를 볼 수 있다. 
거의 트랜잭션의 기능을 수행하지 않는다.
ISOLATION_READ_COMMITTED 데이터베이스에서 디폴트로 지원하는 격리 레벨이다. 
다른 트랜잭션에 의해 Commit되지 않은 데이터는 다른 트랜잭션에서 볼 수 없다.
일반적 으로 가장 많이 사용한다.
ISOLATION_REPEATABLE_READ 다른 트랜잭션이 새로운 데이터를 입력했다면 볼 수 있다. 
트랜잭션이 완료 될때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에대한 수정이 불가능하다
ISOLATION_SERIALIZABLE 하나의 트랜잭션이 완료된 후에 다른 트랜잭션이 실행하는 것처럼 지원한다.
동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행 될 수 없다.

Propagation Behavior (전달 행위)

  • mvc-dispatcher-servlet.xml에 아래의 component-scan으로 패키지를 명시해야 한다.
속성 설 명
PROPAGATION_REQUIRED 기존의 트랜잭션이 존재하면 그 트랜잭션을 지원, 없다면 새로운 트랜잭션을 시작. 
가장 자주 사용되는 옵션
PROPAGATION_SUPPORTS 기존의 트랜잭션이 존재하면 그 트랜잭션을 지원, 없다면 비-트랜잭션 상태로 수행
PROPAGATION_MANDATORY 반드시 Transaction 내에서 메소드가 실행되어야 한다. 없으면 예외발생
PROPAGATION_REQUIRES_NEW 언제나 새로운 트랜잭션을 수행, 이미 활성화된 트랜잭션이 있다면 일시정지 한다.
PROPAGATION_NOT_SUPPORTED 새로운 Transaction을 필요로 하지는 않지만, 기존의 Transaction이 있는 경우에는 Transaction 내에서 메소드를 실행한다.
PROPAGATION_NEVER Manatory와 반대로 Transaction 없이 실행되어야 하며 Transaction이 있으면 예외를 발생시킨다
PROPAGATION_NESTED 현재의 트랜잭션이 존재하면 중첩된 트랜잭션내에서실 행, 없으면 REQUIRED 처럼 동작

 

 

@Transactional 에 관해 구글링 중 좋은 자료 있어서 두고두고 참고하려고 가지고 왔습니다.

출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26741432

 

 

트랜젝션이란?

 

은행 현금인출기(ATM)에서 돈을 인출하는 과정을 생각해 봅시다.

현금인출을 하겠다고 기계에게 알려준뒤 현금카드를 넣어서 본인임을 인증받고,
인출할 금액을 선택하면 ATM 기는 돈을 내어줍니다.

이러한 거래에 있어서 지켜져야 할 중요한 것이 있습니다.
기계의 오동작 등으로 인하여 전산상으로는 돈을 인출한 것으로 입력이 되었는데 돈은 안나온다거나,
돈은 나왔는데 일련의 에러나 문제로 인하여서 돈을 인출한 것이 전산상으로 입력이 안되면
상당히 심각한 문제가 발생하겠죠.

때문에 전산상으로도 입력이 정상적으로 잘 되고, 돈도 인출이 정상적으로 잘 됨을 확인하고 나서야,
인출하는 하나의 과정이 정상적으로 처리되었음을 확인할 수 있습니다.
여기서 돈을 인출하는 일련의 과정이 하나의 묶음으로 처리되어야 함을 이해하실 수 있을것입니다.
그리고 혹시 처리도중 중간에 무슨 문제가 발생한다면 진행되던 인출과정 전체를 취소하고
다시 처음부터 시작하도록 해야 될 것입니다.

이것을 트랜잭션이라고 합니다.
transaction 의 사전적의미와도 상통합니다만, 거래함에 있어서 거래하는 양측이 다 원하는
결과물을 얻어야만 정상적으로 처리되는 것이고 그렇지 않다라면 거래자체가 무산되어 원점으로
되돌려져(roll back) 버리는 것이죠.
전산적으로나 데이터베이스에 있어서도 이처럼 하나의 묶음으로 처리가 이루어져야 하는 모든것에
트랜젝션이란 개념이 사용됩니다.

롤백(roll back) 이란 것은 트랜잭션으로 인한 하나의 묶음처리가 시작되기 이전의 상태로
되돌려지는 것을 말합니다.

커밋(commit) 이란 것은 정상적으로 처리되어서 확정(실행을 위해서 엔터키를 치는 것처럼) 한다는
것이구요. 커밋하면 트랜잭션의 처리과정이 모두 반영되며 하나의 트랜잭션 과정이 끝나게 됩니다.

트랜잭션, 롤백... 이러한 단어들은 모든 처리가 정상적으로만 이루어진다고 한다면 필요없는
것이겠죠. 그러나 항상 예외나 에러는 발생하는 것이며, 이러한 것이 발생할 때에 적절한 처리를
위해서 존재하는 것입니다.

 

 

 

개념이 가물가물해져서 검색하던중 한방에 이해되는 글이 있어서 메모출처 : 지식In 

반응형

'개발 공부 기록하기 > - Spring' 카테고리의 다른 글

Spring No mapping for GET /css/xxx.css  (0) 2023.08.15