본문 바로가기

CS

[DB]트랜잭션(Transaction)

트랜잭션과 잠금(Lock)


트랜잭션

  • 트랜잭션은 작업의 완전성 을 보장해주는 것(= 여러 작업을 논리적인 하나의 작업의 단위로 묶어주는 것)
  • 사용자의 입장에서는 작업의 논리적 단위이며 시스템의 입장에서는 데이터를 접근 및 변경하는 프로그램 단위
  • 트랜잭션은 하나의 논리적인 작업을 구성하는 단위 작업 모두 적용되거나 문제가 있을 시 아무것도 적용되지 않아야 함을 보장(커밋 or 롤백)
  • 예를 들어 1만원이 입금되고 1만원을 송금하는 작업을 트랜잭션으로 묶을 때 둘 중 하나라도 오류가 있으면 작업은 아예 이루어지지 않는다.
  • 멀티트랜잭션 환경, 송금 처리 등 시스템에서 활용

잠금

  • Lock : 데이터베이스의 일관성과 무결성을 유지하기 위해 트랜잭션의 순차적 진행을 보장할 수 있는 장치
  • 잠금(Lock)은 동시성을 제어하기 위한 기능, 트랜잭션은 데이터의 정합성을 보장하기 위한 기능
  • 잠금은 동시에 동일한 자원을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할

트랜잭션의 특징, ACID


원자성(Atomicity)

  • 만약 트랜잭션 중간에 문제가 발생하면 어떠한 작업 내용도 수행되어서는 안되며 아무런 문제가 발생되지 않았을 경우에만 모든 작업이 수행되어야 함

일관성(Consistency)

  • 트랜잭션이 작업 처리 결과는 항상 데이터의 일관성을 보장해야 함
  • 만약 마이너스를 허용하지 않는 DB에 마이너스 작업이 요청된다면 트랙잭션은 수행되지 않아야 함

고립성(Isolation)

  • 각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야 함

지속성(Durability)

  • 트랜잭션이 정상적으로 종료되면 영구적으로 데이터베이스에 작업의 결과가 저장되어야 함

트랜잭션의 상태


  • Active : 트랜잭션의 활동 상태
  • Failed : 트랜잭션이 더이상 정상적으로 진행 할 수 없는 상태
  • Partially Committed : 트랜잭션의 Commit 명령이 도착한 상태
  • Committed : 트랜잭션이 정상적으로 완료된 상태
  • Aborted : 트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태
  • Partial Commited는 Commit 요청이 들어왔을때를 말하며, Commited는 Commit을 정상적으로 완료한 상태

트랜잭션 격리 수준


동시에 DB에 접근할 때 그 접근을 어떻게 제어할지에 대한 설정

  • READ uncommitted : 한 트랜잭션의 커밋 전 데이터를 다른 트랜잭션이 읽는 것을 허용
  • READ committed : 커밋 완료 후 조회 가능
  • REPEATABLE-READ : 항상 조회 내용이 같아야 함을 보장
  • SERIALIZABLE : 한 트랜잭션에서 사용하는 데이터를 다른 트랜잭션 사용 불가
  • 아래로 갈 수록 격리 수준이 높아지지만 성능이 떨어짐(데이터 정합성 - 동시성)

데이터베이스 락 종류


Optimistic lock

  • 낙관적, 비선점적(기본적으로 충돌하지 않을 것이라고 보고 락을 걸지 않음), 버전을 사용해 관리, 어플리케이션 락
  • 충돌이 발생하면 오버헤드 발생

Pessimistic lock

  • 비관적, 선점적(미리 락을 걸어놓음), 데드락 위험성, 데이터베이스락, 무결성의 장점
  • Shared lock : 동시에 읽기는 가능
  • Exclusive lock : 읽기, 업데이트, 삭제 모두 불가능