작업의 완정성을 보장해주기 위해 사용되는 개념
-> 특정 작업을 전부 처리하거나, 전부 실패하게 만들어 ~데이터의 일관성~을 보장해주는 기능이다
( 대부분의 데이터베이스가 트랜잭션의 특징을 이용하고 있다 )
업데이트를 해야하는 기능이 두가지 이상 연속될 경우
한가지만 업데이트 되는 부분 업데이트( partial update) 와 같은 상황을 방지하기 위해서 트랜잭션이라는 개념을 도입하게 되었다.
ex) 작업 내역을 저장하는 로깅 작업, 영화관 예매 시스템, 은행 결제 시스템 등
ATOMICITY 원자성
트랜잭션 내에서 실행되는 명령은 하나의 묶음으로 처리되어
전부 성공하거나 모두 실패하게 된다
ex) a의 계좌에서 금액을 차감한다, b의 계좌에 금액을 증가시킨다
( 하나의 함수처럼 처리한다 )
CONSISTENCY 일관성
트랜잭션 내부에서 처리되는 데이터의 일관성을 유지해야 한다
-> 도중에 실패한 경우에 실패한 상태로 데이터가 방치되는 것이 아닌 처음의 데이터로 되돌아간다
ISOLATION 격리성
트랜잭션을 수행하는 중간 상태를 보거나 변경할 수 없도록 구성한다
( 이에 따라 동시성과 격리수준이라는 개념이 생겨나게 되었다 )
DURABILITY
트랜잭션이 성공적으로 수행되면 수정된 데이터를 시스템에 영구적으로 적용하는 특징
=> 트랜잭션이 성공되어 COMMIT 을 요청했지만 변경사항이 적용되기 전에 DB 가 비정상 종료가 될 경우, DB 를 재시작하면 트랜잭션의 변경사항을 다시 반영하게 된다
동시성 제어를 위해 해당하는 데이터를 점유하여 다른 트랜잭션의 접근을 막아 동시성과 일관성의 균형을 맞추기 위해 사용한다
=> 잘못된 락 설정을 사용하게 되면 교착 상태 ( Dead Lock ) 이 발생해 프로그램이 멈추게 된다
여러 트랜잭션이 동시에 처리될 때 다른 트랜잭션에서 데이터를 읽을 수 있도록 허용하거나 거부하는 것의 수준을 결정하는 것
READ UNCOMMITTED
커밋되지 않은 읽기를 허용하는 수준의 격리 수준
-> 가장 낮은 격리 수준이며 동시성은 높지만 일관성이 쉽게 깨진다
READ COMMITTED
커밋된 읽기 만 허용하고 select 문들 실행할 때 바로 공유락을 건다
-> 데이터를 수정하고 있는 중에는 읽을 수 없다
REPETEABLE READ
읽기를 마치더라도 공유락을 풀지 않고 트랜잭션이 완전히 종료될 때 공유락을 푼다
-> 공유 락이 걸린 상태에서 데이터를 수정할 수는 없지만, 데이터를 삽입하는 것이 가능해 팬텀 읽기 라는 문제가 발생할 수 있다
SERIALIZABLE
데이터를 읽는 동안 다른 트랜잭션이 해당 데이터를 읽거나 삽입할 수 없고, 데이터를 추가하는 것도 불가능하다
-> 가장 높은 수준의 격리 수준으로 동시성이 떨어진