@Transactional

2020. 4. 17. 23:25Java/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