반응형
Spring Transactional 옵션
Tranction 의 성질에 대해 생각해보자
원자성→ 한트렌젝션내에서 실행한 작업들은 하나로 간주하고 작업한다. 즉 모두성공, 혹은 모두 실패이다.
일관성→트렌젝션은 일관성있는 데이터베이스 상태를 유지한다.
격리성→동시에 실행되는 트렌젝션들이 서로에게 영향을 미치지 않도록 한다.
지속성→ 트렌젝션을 마치면 결과가 항상 저장되어야 한다.
Spring Transaction 속성
- name - 메서드명
- isolation (격리수준)
- propagation(전파)
- readOnly
- 트렌젝션롤백 예외 (rollback-for, rollbackfor, rollbackForClassName)
- 논트렌젝션 롤백 예외 (no-rollback-for )
- timeout
name - 메서드명
메서드의 이름이며 와일드 문자()를 사용할 수 있습니다. 예로 'get'은 get으로 시작하는 모든 메서드를 가리키며 '*get'은 get으로 끝나는 모든 메서드를 가리킵니다.
timeout - 제한시간 (기본값 : -1)
트랜잭션의 제한시간을 설정합니다. DB가 해당기능을 지원해야 하며 기본값으로는 -1인 제한시간 없음이 설정됩니다.
Isolation (격리수준)
트랜젝션에서 일관성이 없는 데이터를 허용하도록 하는 수준을 말한다.
- DEFAULT
- DB에서 설정된 기본 격리 수준을 따릅니다.
- READ_UNCOMMITTED (level 0)
- 커밋되지 않은 데이터에 대한 읽기를 허용합니다. → ditry read 발생
- READ_COMMITTED (level 1 )
- 커밋된 트랜잭션에 대해 읽기를 허용합니다. → dirty read 방지
- 커밋되지 않은 데이터는 읽을수 없다.
- REPEATABLE_READ (level 2)
- 동일한 필드에 대한 다중 접근 시 동일한 결과를 얻을 수 잇는 것을 보장합니다. → Non-Repeatable Read 방지
- 트렌젝션이 완료될때까지 select 문장이 사용하는 모든 데이터에 shared lock이 걸림으로 다른 사용자는 그영역에 대한 수정이 불가능 하다.
- 선행으로 읽는 트렌젝션이 발생되었을 경우 종료될때까지 후행 트렌젝션에서 갱신및 삭제가 불가능하다. 이는 같은 데이터에대해 다중 접근 했을시 동일한 결과를 얻을수 있는것을 보장해 준다.
- SERIALIZABLE (level 3)
- 데이터의 일관성 및 동시성을 위해 MVCC*(Multi Version Concurrency Control)을 사용하지 않습니다.
- 트렌젝션이 완료될때까지 select 하는 모든 문장의 데이터에 shard lock 이 걸림으로 다른 사용자는 그영역에 해당되는 데이터 수정 입력이 불가능 하다.
- 가장 높은 격리수준을 가지며 사용시 성능 저하가 있을 수 있습니다.
- ⚠️ MVCC 는 다중 사용자 데이터베이스의 성능을 높이기 위한 기술로 데이터 조회시 LOCK 을 사용하지 않고 데이터의 버전관리를 통해 일관성및 동시성을 높이는 기술이다.
propagation - 전파옵션 (기본값 : REQUIRED)
- REQUIRED
- 디폴트 속성이다.
- 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트렌젝션을 생성합니다.
- REQUIRES_NEW
- 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성되도록 합니다.
- SUPPORT
- 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 non- transactionally 로 실행됩니다.
→ 즉 이미시작된 트렌젝션이 있으면 참여하고 그렇치 않으면 트렌젝션이 없이 진행하게 만든다.
- 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 non- transactionally 로 실행됩니다.
- MANDATORY
- REQUIRED와 비슷하게 부모 트랜잭션 내에서 실행되며 부모 트랜잭션이 없을 경우 예외가 발생됩니다.
→ 즉 이미시작된 트렌젝션이 있으면 해당 트렌젝션 내에서 실행되나 없으면 예외가 발생된다. - 독립적으로 트렌젝션을 진행해서는 안되는 경우에 사용한다.
- REQUIRED와 비슷하게 부모 트랜잭션 내에서 실행되며 부모 트랜잭션이 없을 경우 예외가 발생됩니다.
- NOT_SUPPORT
- non-transactionally 로 실행하며 부모 트랜잭션 내에서 실행될 경우 일시 정지(보류) 됩니다.
- NEVER
- nontransactionally (트랜젝선 사용안함)로 실행되며 부모 트랜잭션이 존재한다면 예외가 발생합니다.
- NESTED
- 이미 진행중인 트랜잭션이 있으면 중첩으로 트랜젝션을 만든다.
- 해당 메서드가 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백될 수 있습니다.
- 둘러싼 트랜잭션이 없을 경우 REQUIRED와 동일하게 작동합니다.
- 단순 예시) 어떤 작업을 진행하는중에 로그는 꼭 DB 에 저장해야 할때 혹은 롤백 해야할때.
- 상품을 결제한뒤 로그를 저장해야 하는데 로그저장에 실패 했다고해서 모두를 롤백시킬 필요는 없다. 이럴때 중첩트렌젝션을 생성하여 메인 트렌젝션이 정상 동작 하도록 한다.
read-only
읽기전용 (기본값 : false)
해당 메서드는 오로지 읽기에만 사용됩니다. INSERT나 UPDATE, DELETE문은 허용되지 않습니다.
만약 쓰기나 삭제가 실행될 경우 에러를 발생시킵니다.
rollback-for
예외처리 (기본값 : RuntimeException)
특정 예외가 발생했을 경우에 롤백되도록 설정합니다.
설정하지 않을 경우 오로지 RuntimeException을 상속받은 예외에만 롤백처리를 해줍니다.
no-rollback-for
예외처리 (기본값 : 없음)
ref.
http://egloos.zum.com/springmvc/v/499291
http://www.nextree.co.kr/p3180/
https://goddaehee.tistory.com/167
반응형
'Spring > Spring Data JPA' 카테고리의 다른 글
No EntityManager with actual transaction available for current thread - cannot reliably process 'merge' call (0) | 2022.05.24 |
---|---|
Hibernate(JPA) 영속성 (persistence) (0) | 2022.04.22 |
Composite-id class must implement Serializable (0) | 2021.11.22 |
JPA Entity 상속 관계 만들기 ,@MappedSuperclass (0) | 2021.05.25 |
Lombok @ToString , JPA 사용시 주의 사항 (0) | 2021.05.25 |