ACID
Atomicity
- 트랜잭션은 모두 수행되던가 아예 실행되지 않아야 함
Consistency
- 트랜잭션의 작업 수행 후에 일관성을 유지해야 함
Isolation
- 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 경우에 어느 하나의 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들지 못함
Durability
- 트랜잭션이 성공적으로 완료됐을 경우, 그 결과는 영구적으로 반영되어야 함
Concurrency(동시성)
- 동시에 여러 작업을 수행하는 특성
- 동시에 여러 작업이 같은 공간에 접근하면 Conflict 발생(e.g. 예약 시스템)
- 서울의 A와 부산의 B가 대전에서 열리는 콘서트 예매를 하려 함
- 둘 다 동시에 페이지에 접근하여 두 사람 모두 현재 공석으로 표시됨
- 둘 다 같은 자리에 예매하게 되었으나, 논리적으로는 문제 없음
- 결국 둘은 같은 자리의 예메 티켓을 들고 콘서트를 가게됨
- 이러한 문제를 트랜잭션을 통해 해결할 수 있음
Serializability
- 같은 데이터베이스의 함수 연산 실행이 다른 함수의 실행이 완전히 종료된 후에 실행되도록하는 것
- 실행 시간은 겹칠 수 있지만 실행은 연속적으로(순차적으로) 실행되는 경우 그 실행은 serializable 하다고 함
Atomicity
- 둘 이상의 작업을 거의 동시에 수행할 경우 발생할 수 있는 비시리얼화된 동작 외에도, 작업이 실행되는 동안 하드웨어 또는 소프트웨어 충돌이 발생할 경우 단일 작업이 데이터베이스를 허용할 수 없는 상태로 설정하는 것이 가능함
Transaction
- 직렬화와 원자성 문제를 해결하는 방법은 그룹 연산을 트랜잭션으로 만드는 것
- 트랜잭션은 반드시 atomically하고 serializably하게 실행되어야 하는 하나 이상의 연산의 컬렉션
Transaction Properties(ACID)
- Atomicity: 프로그래머가 트랜잭션 바운더리를 명시하거나 해야 함
- START TRANSACTION
- COMMIT / ROLLBACK
- Isolation: 프로그래머가 격리성 레벨을 명시하거나 해야 함
- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; (SQL 표준 기본값)
- SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- SET TRANSACTION ISOLATION LEVEL READ COMMITED; (많은 DBMS의 기본값)
- SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
- Consistency: DBMS에서 처리
- Durability: DBMS에서 처리
Start Transaction
BEGIN TRANSACTION
START TRANSACTION
End Transaction
COMMIT
: 성공적으로 트랜잭션을 마무리하는 키워드.COMMIT
이 수행되면 되돌릴 수 없음
ROLLBACK
: 트랜잭션을 취소하거나 불완전하게 중지하는 키워드
Auto-Commit Mode(Default mode of PostgreSQL)
- 각 SQL 문을 트랜잭션으로 실행함
- 이 모드에서
COMMIT
을 미루기 위해서는 반드시BEGIN
orSTART TRANSACTION
SQL 명령을 입력해야 함- SQL 명령은 사용자가 정확히 COMMIT 또는 ROLLBACK을 발행할 때까지 커밋되거나 버려지지 않음
- 또한 커밋하기 전에 세션을 exit하면 작업을 모두 잃어버릴 수 있음
Non-Auto-Commit Mode
- 사용자가 직접 트랜잭션을 제어하는 모드
- 트랜잭션은 어느 SQL(DML and DDL) 문이 시작됐을 때 시작됨
- 사용자는 반드시 트랜잭션을 정확히 끝내야 함
COMMIT
- 현재 트랜잭션이 시작된 이후 데이터베이스에 대한 변경사항이 영구적으로 반영됨
COMMIT
문이 실행되기 전에, 변경사항은 잠재적이며, 다른 트랜잭션에 보일 수도 있고 그렇지 않을 수도 있음
ROLLBACK
- 트랜잭션의 SQL 문의 응답으로 변경된 사항을 취소함
Read-Only Transaction
- READ만 수행하는 트랜잭션을 수행할 경우 다음 키워드를 추가하여 사용할 수 있음
SET TRANSACTION READ ONLY;
Start Transaction
이후 처음으로 입력해야 함
Read-Write Transaction
- READ, WRITE를 수행하는 트랜잭션인 경우 다음과 같이 사용할 수 있음
- 이 옵션은 디폴트 값이므로 불필요한 설정임
SET TRANSACTION READ WRITE;
Isolation Level
단계가 내려갈수록 속도가 빨라지고 동시성 증가, 하지만 오류 발생확률 증가
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
(SQL 표준 기본값)- Phantom tuple 금지
- 현재 트랜잭션 진행 중 다른 유저가 데이터를 삽입, 삭제하는 경우가 있음
- 이때 트랜잭션 수행 중 데이터 조회 시 데이터가 갑자기 생기거나 사라지는 튜플을 말함
- 즉, 현재 수행 중인 트랜잭션에서 사용 중인 데이터만을 사용하도록 하는 것
- Dirty reads 금지
- Reads are repeatable
- 현재 트랜잭션 내에서 데이터를 수정하기 전에는 항상 같은 데이터를 읽음
- 동시성에 관한 문제가 절대 일어나지 않음
- 그만큼 속도가 느림
- 돈을 다루거나 생명과 직결된 시스템의 경우 반드시 이 레벨을 사용해야 함
- Phantom tuple 금지
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- Phantom tuple 허용
- Dirty reads 금지
- Reads are repeatable
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
(많은 DBMS의 기본값)- Phantom tuple 허용
- Dirty reads 금지
- Reads are not repeatable
- 대부분의 DBMS가 속도를 위해 이 레벨을 기본값으로 사용함
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
- Phantom tuple 허용
- Dirty reads 허용
- Reads are not repeatable
- 전문가가 아니면 건들지 않은 편이 좋음
Dirty Data
- 커밋되지 않은 트랜잭션에 의해 쓰여진 데이터를 부르는 일반적인 용어
Dirty Reads
- 다른 트랜잭션의 Dirty Data를 읽는 동작
- 일반적인 상황에서는 하면 안 되는 행위
Uploaded by Notion2Tistory v1.1.0