트랜잭션(Transaction)

Jungmin Lee·2021년 4월 14일
0

CS

목록 보기
2/8
post-thumbnail

gyoogle.dev 블로그와 탕구리 블로그를 참고하여 작성하였습니다.
이미지를 누르면 이미지의 출처로 이동합니다.

트랜잭션

  • 데이터베이스의 상태를 변화시키기 위해 수행하는 작업단위로 작업의 완전성을 보장해 주는 것
    • 작업단위란 SQL명령문들을 사람이 정하는 기준에 따라 정해놓은 단위
    • 논리적 작업셋을 완벽하게 처리하거나 그렇지못한경우 원 상태로 복구한다.

트랜잭션 특징(ACID)

  • 원자성(Atomicity)
    : 트랜잭션이 DB에 모두 반영되거나 전혀 반영되지 않아야한다.

  • 일관성(Consistency)
    : 트랜잭션의 작업처리 결과는 항상 일관성이 있어야 한다

  • 독립성(Isolation)
    : 둘 이상의 동시에 병행실행중일 때 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.

  • 지속성(Durability)
    : 트랜잭션이 성공적으로 완료되었으면 결과는 영구반영되어야 한다.

Commit과 Rollback

1) Commit

  • 하나의 트랜잭션 성공적으로 수행으로 마침
  • DB의 일관된 상태 알려주는 연산

2) Rollback

  • 하나의 트랜잭션 처리 비정상종료->원자성이 깨진 상태에 수행
  • Last consistent state로 rollback가능

DBMS의 구조

  • 크게 질의처리기, 저장시스템으로 나뉨
  • 입출력 단위는 고정길이의 page단위
  • 저장공간은 디스크에 저장하며 일부 Main Memory에 저장

page buffer

  • 메인 메모리에 유지하는 페이지를 관리하는 모듈로 UNDO, REDO요구를 할 수 있다.

1)UNDO

  • Buffer 교체는 트랜잭션과 무관하게 buffer의 상태에 따라 결정되므로 정상적으로 종료못한 트랜잭션의 결과를 원상복구시켜야 한다. 이 복구가 UNDO이다.
  • 두가지 정책
    • 수정된 페이지 언제든지 디스크에 쓸 수 있는 정책
    • 수정된 페이지들을 최소한 트랜잭션 종료지점까지는 버퍼에 유지하는 정책
      • 많은양의 버퍼필요->잘 사용하지 않음

2)REDO

  • 이미 커밋된 트랜잭션의 수정을 재반영하는 복구작업
  • DBMS에서 이루어지는 작업은 REDO LOG에 기록되므로 이 내용을 기반으로 REDO 수행
  • 두가지 정책
    • 수정했던 모든 페이지를 트랜잭션 커밋 시점에 디스크에 반영

      transaction이 commit 되었을 때 수정된 페이지들이 disk 상에 반영되므로 redo 필요 없음

    • 수정했던 페이지 트랜잭션 커밋 시점에 디스크에 반영하지 않기

      디스크에 수정한 페이지가 반영되지 않더라도 어떤 작업을 했는지 로그에 기록되므로 필요시 UNDO, REDO가능

트랜잭션 격리수준

  • 트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준
  • 트랜잭션이 DB다루는 동안 다른 트랜잭션이 관여하지 못하도록 Locking을 통해 막아야한다.
  • 무조건 Locking 통해 막으면 성능이 떨어지게 되지만 성능높이기 위해 Locking범위 줄이면 잘못처리될 문제 발생하게 된다.
  • 최선의 Locking 방법을 찾아야한다.

격리 레벨 종류

1) 레벨 0(Read Uncommitted)

  • SELECT 수행중에 Shared Lock 안걸림
  • 처리중이거나 commit되지 않은 데이터 다른 트랜잭션이 읽는 것 허옹
  • 일관성 유지 불가능

2) 레벨 1(Read Commited)

  • SELECT 문장 수행중에 Shared Lock 걸림
  • 트랜잭션 수행 중 다른 트랜잭션은 대기
  • Commit 이루어진 트랜잭션만 조회가능
  • SQL 서버의 Default 레벨

3) 레벨 2(Repeatable Read)

  • 트랜잭션이 완료될 때까지 SELECT문장이 사용하는 모든 데이터에 Shared Lock걸림
  • 트랜잭션이 범위 내에서 조회한 데이터 항상 동일
  • 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 불가능
  • 자신의 트랜잭션 번호보다 낮은 트랜잭션 번호에서 커밋된 것만 보게 되는 것

4) 레벨 3(Serializable)

  • 트랜잭션이 완료될 때까지 SELECT문장이 사용하는 모든 데이터에 Shared Lock걸림
  • 완벽한 읽기 일관성 모드 제공
  • 다른 사용자는 트랜잭션 영역에 해당하는 데이터에 대한 수정, 입력 불가능

발생가능한 문제점들

  • Dirty Read: 커밋안된 수정중인 데이터 다른 트랜잭션에서 읽을 수 있도록 허용해서 발생
  • Non-Repeatable Read: 한 트랜잭션에서 같은 쿼리 두번 수행할때 그 사이에 수정, 삭제하면서 쿼리의 결과가 상이하게 나타나는 일관성이 깨진 현상
  • Phantom Read: 한 트랜잭션 안에서 레코드 두번이상 읽었을때, 없던 쿼리가 나타나는 현상
profile
금융 도메인과 개발 지식을 함께 쌓아가는 주니어 개발자입니다😊

0개의 댓글