@Transactional
2020. 4. 17. 23:25ㆍJava/Spring
반응형
트랜잭션의 성질
- 원자성: 한 트랜잭션 내에서 실행한 작업들은 하나로 간주합니다.
- 일관성: 트랜잭션은 일관성 있는 데이터베이스 상태를 유지합니다.
- 격리성: 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리합니다.
- 지속성: 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 합니다.
스프링에서 트랜잭션 처리 방법
스프링은 트랜잭션 처리를 지원합니다. 일반적으로 @Transactional을 선언하여 사용하는 선언적 트랜잭션을 사용합니다. 클래스, 메소드 위에 @Transactional이 추가되면, 이 클래스에 트랜잭션 기능이 적용됩니다. 이 객체는 @Transactional이 포함된 메소드가 호출 될 경우, 구현된 PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit 또는 Rollback을 합니다.
@Transactional
public boolean insertUser(User user){
...
}
다수의 트랜잭션이 경쟁 시 발생할 수 있는 문제
- Dirty Read: 아직 트랜잭션이 완료되지 않은 상황에서 데이터에 접근을 허용할 경우 발생할 수 있는 데이터 불일치입니다.
- Non-Repeatable Read: 한 트랜잭션에서 같은 쿼리를 두 번 실행했을 때, 발생할 수 있는 데이터 불일치입니다.
- PhantomRead: 한 트랜잭션에서 일정 범위의 레코드를 두 번 이상 읽을 때 발생하는 데이터 불일치입니다.
@Transactional의 속성
Isolation(격리 수준)
- DEFAULT: 기본 격리 수준
- READ_UNCOMMITTED: 커밋되지 않는(트랜잭션 처리 중인) 데이터에 대한 읽기를 허용
- READ_COMMITTED: 트랜잭션이 커밋 된 확정 데이터만 읽기 허용
- REPEATABLE_READ: 선행 트랜잭션의 작업이 끝날 때까지 후행 트랜잭션이 갱신하거나 삭제를 할 수 없도록 모든 데이터에 shared lock이 걸림
- SERIALIZABLE: 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 해당 데이터에 대한 수정 및 입력이 불가능
Propagation(전파 옵션)
트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황에 선택할 수 있는 옵션입니다.
- REQUIRED: 디폴트 속성으로 부모 트랜잭션 내에서 실행하며, 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성
- SUPPORTS: 이미 시작된 트랜잭션이 있으면 참여하고 그렇지 않으면 트랜잭션 없이 진행
- REQUIRED_NEW: 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션을 생성
- MANDATORY: REQUIRED와 유사하게 이미 시작된 트랜잭션이 있으면 참여하지만, 시작된 트랜잭션이 없으면 예외를 발생
- REQUIRES_NEW: 항상 새로운 트랜잭션을 시작. 이미 진행 중인 트랜잭션이 있으면 트랜잭션을 잠시 보류
- NOT_SUPPORTED: 트랜잭션을 사용하지 않음. 이미 진행중인 트랜잭션이 있으면 보류
- NEVER: 트랜잭션을 사용하지 않도록 강제함. 이미 진행중인 트랜잭션이 있으면 예외를 발생
- NESTED: 이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작. 중첩된 트랜잭션은 부모의 커밋과 롤백에는 영항을 받지만, 자신의 커밋과 롤백은 부모에게 영향을 주지 않음
ReadOnly
트랜잭션 읽기 전용으로 설정할 수 있습니다. 성능을 취적화하기 위해 사용할 수도 있고, 특정 트랜잭션 작업 안에서 쓰기 작업이 일어나는 것을 의도적으로 방지하기 위해 사용할 수도 있습니다.
트랜잭션 롤백 예외
(rollback-for, rollbackFor, rollbackForClassName)
선언적 트랜잭션에서는 UnCheckedException이 발생하면 롤백합니다. 반면에 예외가 발생하지 않거나 CheckedException이 발생하면 커밋합니다.
Timeout
지정한 시간 내에 해당 메소드 수행이 완료되지 않은 경우 rollback을 수행합니다.
반응형
'Java > Spring' 카테고리의 다른 글
Spring Singleton (0) | 2020.05.01 |
---|---|
@ExceptionHandler (0) | 2020.04.26 |
AOP (0) | 2020.04.18 |
Spring DI 방법 (0) | 2020.03.27 |
Spring 설정을 XML에서 Java Config로 바꾸기 (0) | 2020.03.27 |