@Transactional

2020. 4. 17. 23:25Java/Spring

1. 트랜잭션의 성질

원자성

 한 트랜잭션 내에서 실행한 작업들은 하나로 간주합니다.

일관성

 트랜잭션은 일관성 있는 데이터베이스 상태를 유지합니다.

격리성

 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리합니다.

지속성

 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 합니다.

2. 스프링에서 트랜잭션 처리 방법

 스프링은 트랜잭션 처리를 지원합니다. 일반적으로 @Transactional을 선언하여 사용하는 선언적 트랜잭션을 사용합니다. 클래스, 메소드 위에 @Transactional이 추가되면, 이 클래스에 트랜잭션 기능이 적용됩니다. 이 객체는 @Transactional이 포함된 메소드가 호출 될 경우, 구현된 PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit 또는 Rollback을 합니다.

@Transactional

public boolean insertUser(User user){

  ...

}

3. 다수의 트랜잭션이 경쟁 시 발생할 수 있는 문제

Dirty Read

 아직 트랜잭션이 완료되지 않은 상황에서 데이터에 접근을 허용할 경우 발생할 수 있는 데이터 불일치입니다.

Non-Repeatable Read

 한 트랜잭션에서 같은 쿼리를 두 번 실행했을 때, 발생할 수 있는 데이터 불일치입니다.

Phantom Read

 한 트랜잭션에서 일정 범위의 레코드를 두 번 이상 읽을 때 발생하는 데이터 불일치입니다.

4. @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을 수행합니다.

728x90

'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