트렌젝션

?에서 !로·2022년 2월 10일
0

CS(Computer Science)

목록 보기
11/14

트렌젝션

트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키기 위해 수행하는 작업의 논리적인 단위이다. 하나의 트랜잭션은 Commit되거나 Rollback된다.

성질 (ACID)

  • 원자성 (Atomicity) : 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.

  • 일관성 (Consistency): 트랜잭션 작업 처리의 결과가 항상 일관되어야 한다. 즉, 데이터 타입이 반환 후와 전이 항상 동일해야 한다.

  • 독립성,격리성 (Isolation) : 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션의 연산이 끼어들 수 없다.

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

Commit

하나의 트랜잭션이 성공적으로 끝나서 데이터베이스가 일관성있는 상태에 있음을 의미한다.

Rollback

Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산이다. Rollback시에는 해당 트랜잭션을 재시작하거나 폐기한다.

Lock은 동시성을 제어하기 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하기 위한 기능이다. Lock은 여러 커넥션에서 동시에 동일한 자원(레코드, 테이블)을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할을 한다.

+) 블로킹(Blocking) : 어떤 프로세스가 자원에 접근하려고 할 때 이미 다른 프로세스가 그 자원을 Lock 하고 있어서 그 Lock이 풀릴 때까지 기다려야 하는 상황

트랜잭션의 상태

  • Active
    트랜잭션의 활동 상태. 트랜잭션이 실행중이며 동작중인 상태를 말한다.

  • Failed
    트랜잭션 실패 상태. 트랜잭션이 더이상 정상적으로 진행 할 수 없는 상태를 말한다.

  • Partially Committed
    트랜잭션의 commit이전 sql문이 수행되고 commit만 남은 상태를 말한다. 이후 Commit을 문제없이 수행할 수 있으면 Committed 상태로 전이되고, 만약 오류가 발생하면 Failed 상태가 된다.

  • Committed
    트랜잭션 완료 상태. 트랜잭션이 정상적으로 완료된 상태를 말한다.

  • Aborted
    트랜잭션이 취소 상태. 트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태를 말한다.

데이터베이스 Connection 개수는 제한적이다. 트렌젝션은 Connection을 비교적 오래 소유하고 있을 가능성이 있기 때문에 트랜잭션의 범위를 최소화 하는 것이 좋다.

트렌젝션 격리 수준

여러 트랜잭션이 동시에 작업을 수행할 때 한 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것이다. 트랜잭션의 격리수준이 낮아질수록 동시성이 증가하지만, 무결성, 고립성 등 문제가 발생하고 격리수준이 높아질수록 동시성은 감소하지만, 무결성, 고립성을 지킬 수 있다.

트랜잭션의 격리수준에 따라 Dirty Read, Non-Repeatable Read, Phantom Read의 문제가 발생할 수 있다.

  • Dirty Read : 다른 트랜잭션에서 아직 commit 되지 않은 데이터를 조회하는 문제. 트랜잭션이 rollback시 존재하지 않는 데이터를 참조할 수 있다.
  • Non-Repeatable Read : 한 트랜잭션 내에서 같은 행을 여러 번 조회할 때 처음 조회 결과와 다른 경우
  • Phantom Read : 한 트랜잭션 내에서 같은 쿼리문이 실행했을 때 이전 select에서 존재하지 않던 레코드가 두 번째 쿼리에서 나타나는 현상. 한 트랜잭션 수행 중 다른 트랜잭션이 새로운 레코드를 삽입함으로써 나타난다.

0단계 Read Uncommitted

트랜잭션에서 변경하는 내용이 commit, rollback 여부에 관계없이 다른 트랜잭션에 노출한다.
Dirty Read, Non-Repeatable Read, Phantom Read 발생

1단계 Read committed

Commit이 완료된 데이터에 대해서만 조회를 허용한다. 트랜잭션이 수행되는 동안 다른 트랜잭션은 접근할 수 없어 대기
Non-Repeatable, Phantom Read 발생 가능

2단계 Repeatable Read

트랜잭션이 시작되기 전에 Commit된 내용에 대해서만 조회 가능. 트랜잭션의 첫 읽기의 결과를 undo 공간에 백업해두고 이후에 같은 레코드 조회 시 저장한 스냅 샷을 읽어 일관된 결과를 얻는다. update 된 내용은 정합성이 보장되지만, insert, delete는 보장되지 않는다.
Phantom Read 발생 가능,

3단계 Serializable

단순 읽기 작업에서도 해당 행에 대해서 락을 거는 가장 엄격한 격리 수준. 동시성이 중요한 db에서는 거의 사용하지 않는다.

교착 상태(Deadlock)

여러 개의 트랜잭션을 사용할때 데이터의 동시성을 위해 Lock을 사용하게 되는데, 특정 자원(테이블 또는 행)의 잠금(Lock)을 획득한 채 다른 트랜잭션이 소유하고 있는 잠금을 요구하여 무한정 대기하게 되는 상황을 교착상태라고 한다.

교착 상태의 빈도를 낮추는 방법

  1. 트랜잭션을 자주 커밋한다.
  2. 정해진 순서로 테이블에 접근한다.
  3. 읽기 잠금 획득 (SELECT ~ FOR UPDATE)의 사용을 피한다.
  4. 테이블 단위의 잠금을 획득하면 동시성을 떨어지지만 교착상태를 회피할 수 있다.

0개의 댓글