개발/이것저것

Transaction이란?

태감새 2023. 4. 23. 09:20

Transaction

하나의 작업을 수행하기 위한 연산을 모아놓은 것. 어떤 작업을 수행할 때 우리는 DB에 여러개의 요청을 보내야 하는 경우가 많다. 이때 작업을 진행하다가 오류가 발생해서 중단된다면 오류 이전의 요청을 처리되고 이후의 요청은 처리되지 않아서 데이터의 무결성이 깨지게 된다. 이때 여러개의 요청이 하나의 트랜잭션으로 묶여 있다면 오류가 발생했을 때 앞서 수행한 작업들도 무효화시켜서 모든 작업을 되돌릴 수 있다.

특징

ACID → 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질

Atomicity / 원자성

트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력
→ Commit or Roll-back / 모두 성공하거나 모두 실패하거나 둘 중 하나 

데이터에 변화가 생기면 기존 데이터는 Undo Log에 저장됨. 그 후 트랜잭션이 commit되면 변경된 데이터가 기존 데이터가 되고 문제가 발생하면 Undo Log의 데이터를 다시 기존 데이터에 입력.

Consistency / 일관성

트랙잭션이 실행을 성공하면 언제나 일관성있는 상태로 유지하는 것을 의미 (커밋 전과 후의 데이터 일관성)
→ 도메인의 유효범위, 제약 조건을 위배하지 않는 상태를 유지

Isolation / 독립성

트랜잭션을 수행 시 다른 트랜잭션의 연산작업이 끼어들지 못하도록 보장하는 것을 의미
→ 성능에 대한 문제가 있어서 격리 레벨을 조절하여 개발자가 제어 가능.

Durability / 지속성

성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미

 

@Transactional

트랜잭션을 보장하고 싶은 메서드 위에다가 붙이면 그 메서드가 한 트랜잭션으로 구성됨.
→ 트랜잭션을 명시하지 않으면 하나의 SQL문이 한 트랜잭션으로 동작

inner method의 @Transactional

inner method에 @Transational을 붙이면 트랜잭션이 정상적으로 작동하지 않는다.

  • 접근 제어자가 public이여도 마찬가지
public Class Test {

    public void test() {
        getInnerMethod();
    }

    @Transactional
    private void getInnerMethod() {
        Systme.out.println("inner method");
    }
}

@Transational이 스프링에서 프록시 패턴으로 작동하기 때문인데 우선 프록시 패턴을 알아야 한다.

프록시 패턴
특정 작업을 수행할 때 그 클래스의 메서드를 직접 실행하는 것이 아닌 다른 객체를 생성해서 대신 수행하는 방법

프록시


RealSubject의 DoAction()을 호출하면 RealSubjet가 아닌 Proxy가 DoAction()메서드를 수행한다.

프록시 패턴이 작동하려면 외부 객체에서 메서드를 호출해야 한다. 하지만 inner method는 접근 제어자가 private이기 때문에 프록시 객체에서 접근이 불가능하다. 그래서 트랜잭션이 수행되지 못하는 것이다.

 

Isolation level

ACID 중 세 번째인 독립성은 성능에 영향을 미치므로 개발자가 격리 레벨을 조절하여 조정할 수 있다고 했다. 격리 레벨을 알아보기 전에 대표적인 이상을 알아보자.

트랜잭션간의 충돌을 가정해야 하므로 txA, txB 두 가지 트랜잭션이 수행되고 있다고 가정

Dirth Read

상황
txA에서 C라는 데이터를 변경하고 오류가 발생해서 롤백하기 직전에 txB가 변경된 C의 값을 읽는 경우

Dirty Read는 커밋되지 않은 데이터를 읽는 현상을 의미한다.

Non Repeatable Read

상황
txA는 반복적으로 C의 데이터를 조회
txB는 C의 데이터를 변경하고 커밋
그러면 txB의 커밋을 기준으로 txA가 조회하고 있는 C의 값이 바뀌게 된다.

Non Reapeatable Read는 반복적으로 데이터를 읽어오는데 다른 트랜잭션의 커밋으로 읽어오던 데이터가 변경되어서 같은 명령어임에도 결과가 달라지는 현상을 의미한다.

Phantom Read

Phantom Read는 Non Repeatable Read와 비슷하다. 같은 데이터가 아닌 같은 조건의 데이터를 읽어오는데 다른 트랜잭션에서의 커밋으로 결과가 달라지는 현상을 의미한다.

Isolation level

  Dirty Read Non Repeatable Read Phantom Read
Read Uncommitted O O O
Read Committed   O O
Repeatable Read     O
Serializable Read      

Serializable Read는 위 세 가지 현상을 모두 금지하고 Read Uncommitted은 모두 허용한다.

'개발 > 이것저것' 카테고리의 다른 글

동기와 비동기  (0) 2023.05.07
fulltext vs elastic search 점수 계산 알고리즘  (0) 2023.04.26
Circuit Breaker  (0) 2023.04.16
도커 (Docker)  (0) 2023.03.10
웹소켓  (0) 2023.03.01