Transaction(트랜잭션)

작업의 완전성을 보장해주는 기능

트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 아니더라도, 논리적인 작업 자체가 적용(Commit)되거나, 모두 적용되지 않아야(Rollback) 보장한다고 할 수 있다.

ACID

트랜잭션은 ACID의 특성을 가지고 있으며, 그 의미와 특징, 그리고 보장 방법을 간단히 설명하면 아래와 같다.

ACID 특성설명보장 방법

원자성(Atomicity)

트랜잭션의 모든 작업이 정상적으로 수행되거나, 아니면 전혀 수행되지 않는 것

Undo-log를 통한 트랜잭션 이전 상태로의 복구로 원자성 보장

일관성(Consistency)

트랜잭션을 수행 전과 수행 후에 데이터베이스의 일관된 상태 유지

유니크 제약조건, 외래키 제약조건 등의 적용으로 일관성 보장

고립성(Isolation)

트랜잭션 수행 중 다른 트랜잭션의 작업이 데이터 변경을 일으키지 못하는 상태

Isolation Level 조정을 통한 고립성 보장

지속성(Durability)

트랜잭션 완료 후 결과의 영구적 반영

시스템 장애 시, Redo-log에서 커밋된 트랜잭션의 읽기를 통한 지속성 보장

트랜잭션 범위 최소화

트랜잭션은 최대한 작은 범위로 유지하는 것이 좋다. 커넥션 수가 제한적이기 때문에 범위가 커질수록 커넥션을 많이 사용하게 되고, 이는 성능 저하를 일으킬 수 있다.

예시

1) 처리 시작
    => 데이터베이스 커넥션 생성
    => 트랜잭션 시작
2) 사용자의 로그인 여부 확인
3) 사용자의 글쓰기 내용의 오류 여부 확인
4) 첨부로 업로드된 파일 확인 및 저장
5) 사용자의 입력 내용을 DBMS에 저장
6) 첨부 파일 정보를 DBMS에 저장
7) 저장된 내용 또는 기타 정보를 DBMS에서 조회
8) 게시물 등록에 대한 알림 메일 발송
9) 알림 메일 발송 이력을 DBMS에 저장
    <= 트랜잭션 종료(COMMIT)
    <= 데이터베이스 커넥션 반납
10) 처리 완료

위의 프로세스에서 아래와 같은 문제점이 있다.

  1. 실제로 DBMS에 데이터를 저장하는 작업(트랜잭션)은 5번부터 시작

    • 1번부터 4번까지의 작업들은 트랜잭션 범위에 포함시키지 않는 것이 좋음

  2. 8번의 알림 메일 전송과 같은 원격 서버와 통신하는 작업

    • 원격 통신할 수 없는 상황이라면 웹 서버 뿐만 아니라 DBMS도 위험해지는 상황이 발생할 수 있음

  3. 9번의 알림 메일 발송 이력을 DBMS에 저장하는 작업

    • 5/6번의 작업과 성격이 다른 작업이므로 트랜잭션 범위에 포함시키지 않는 것이 좋음

트랜잭션 범위 최소화 예시

1) 처리 시작
2) 사용자의 로그인 여부 확인
3) 사용자의 글쓰기 내용의 오류 여부 확인
4) 첨부로 업로드된 파일 확인 및 저장
    => 데이터베이스 커넥션 생성
    => 트랜잭션 시작
5) 사용자의 입력 내용을 DBMS에 저장
6) 첨부 파일 정보를 DBMS에 저장
    <= 트랜잭션 종료(COMMIT)
7) 저장된 내용 또는 기타 정보를 DBMS에서 조회
8) 게시물 등록에 대한 알림 메일 발송
    => 트랜잭션 시작
9) 알림 메일 발송 이력을 DBMS에 저장
    <= 트랜잭션 종료(COMMIT)
    <= 데이터베이스 커넥션 반납
10) 처리 완료

결론적으로 프로그램 코드에서 트랜잭션 범위를 최소화 시켜 커넥션을 가지고 있는 범위를 최소화 시키는 것과, 원격 통신을 하는 작업은 트랜잭션 범위에 포함시키지 않는 것이 좋다.

참고자료

Last updated