본문 바로가기

이노베이션캠프/TIL

트랜잭션


Transaction

 

트랜잭션이란?

트랜잭션은 작업의 완전성을 보장하기 위해 사용되는 개념으로, 데이터베이스에서 여러 작업을 하나의 논리적인 단위로 묶어 모두 성공하거나 모두 실패하도록 처리함으로써 데이터의 일관성과 무결성을 유지해줍니다.

 

쉽게 말해, A라는 큰 작업이 있다고 할 때, 이 작업을 완료하려면 B와 C라는 두 개의 세부 작업이 모두 성공해야 합니다.


그런데 B는 정상적으로 끝났지만, C가 에러로 인해 중간에 멈췄다면 어떻게 될까요?


B에서 변경된 내용이 그대로 저장된 채로 남아 있다면, 나중에 다시 A 작업을 수행할 때 잘못된 상태에서 작업이 진행되어 데이터 불일치가 발생할 수 있습니다.

 

이런 상황을 방지하기 위해 트랜잭션을 사용합니다. 트랜잭션 안에서는 모든 작업이 성공했을 때만 최종적으로 반영하고, 중간에 하나라도 실패하면 모든 작업을 원래 상태로 되돌려 데이터의 일관성을 보장합니다.

 

트랜잭션의 특징(ACID)

  • 원자성(Atomicity)
    • 트랜잭션 내에서 실행되는 명령들은 전부 성공하거나, 아니면 모두 실패해야한다는 특징
    • 원자성이란, 나눠질 없는 단일 작업
  • 일관성(Consistency)
    • 작업이 성공할 경우 아무런 문제가 발생하지 않고, 실패하더라도 작업을 진행하던 도중 실패한 상태로 데이트를 방치하지 않는 특징
  • 격리성(Isolation)
    • 트랜잭션이 완전히 수행되거나 완전히 수행되지 않는 상태를 외부에서 참조를 할 수는 있지만, 중간과정이나 중간 결과를 볼 수 없도록 하는 특징
    • 데이터 무결성을 보장
    • 동시성과 격리 수준, 두 가지 중요한 개념이 나타나게 됨
❓ 동시성 이란?

여러 클라이언트가 동시에 하나의 데이터를 사용 및 공유 하는 것을 뜻합니다. 동시성은 다수의 사용자가 동일한 시스템을 공유하면서 발생하는 동시 접근 문제를 해결해야 합니다.
  • 지속성(Durability)
    • 트랜잭션이 완료되면 결과는 데이터베이스에 영구적으로 저장되며, 이후 시스템에 어떠한 문제가 생기더라도 데이터는 손상되지 않는 특징

 

락(Lock) 이란?

동시성을 제어하기 위해 사용하는 기능입니다. 해당하는 데이터를 점유하여 다른 트랜잭션의 접근을 막아 동시성일관성균형을 맞추기 위해 사용합니다.

 

락(Lock)의 종류

  • 공유락, 읽기 락
    • 다른 트랜잭션이 데이터를 읽는 것은 허용, 수정하는 것은 금지
  • 베타락, 쓰기락
    • 다른 트랜잭션이 데이터를 읽거나, 수정하는 것을 금지

락킹 수준(Locking Level)

  • 글로벌락, 데이터베이스 락
    • 데이터베이스의 모든 테이블에 락을 걸어, 현재 트랜잭션을 제외한 나머지 트랜잭션들이 모든 테이블을 사용할 수 없도록 만듭니다.
  • 테이블락
    • 다른 사용자가 작업중인 테이블을 동시에 수정하지 못하도록 합니다.
  • 네임드 락
    • 테이블이나 테이블의 행과같은 DB 오브젝트가 아닌, 특정한 문자열점유합니다.
  • 메타데이터 락
    • 다른 사용자가 작업중인 테이블의 동일한 행 및 동일한 데이터베이스의 객체를 동시에 수정하지 못하도록 합니다.

 

트랜잭션의 격리 수준

  • 여러 트랜잭션이 동시에 처리될 때 다른 트랜잭션에서 변경 및 조회하는 데이터를 읽을 수 있도록 허용하거나 거부하는 것을 결정하기 위해 사용하는 것 입니다.

트랜잭션의 격리 수준으 대표적으로 4가지 나타냅니다.

  • READ UNCOMMITTED: 커밋 되지 않은 읽기
  • READ COMMITED: 커밋 된 읽기
  • REPEATABLE READl: 읽기 마치더라도 공유락을 풀지 않으며, 트랜잭션이 완전히 종료될 떼 까지 락을 유지
  • SERIALIZABLE: 데이터를 읽는 동안 다른 트랜잭션이 해당 데이터를 읽거나 삽입 할 없고, 새로운 데이터를 추가하는 것 또한 불가능