Transaction
Data Base 관점에서의 Transaction이란 하나의 작업으로 취급되는 묶여진 모든 작업을 뜻하며, Transaction은 통칭 ACID 이라는 4가지 특징을 가진다!
원자성(Atomicity)
트랜잭션 내부에 있는 작업들은 모두가 하나인 것 처럼 취급이 된다!
작업들이 전부 성공하거나, 하나라도 실패하면 모두가 실패하는 연대책임을 지게 된다!
=> 이러한 특성 덕분에 오류 상황에서의 데이터 손실/손상이 방지된다!
일관성(Consistency)
트랜잭션의 각 작업들에 의해 변경될 테이블들의 데이터들은 모두 테이블의 제약조건을 만족해야 한다! 다시말해, 테이블의 규칙을 만족하며 데이터들을 수정해야만 변경사항들이 적용된다는 말이다.
=> 이러한 특성 덕분에 테이블의 무결성을 유지해 의도치 않은 결과를 방지한다!
격리성(Isolation)
사용하는 테이블을 트랜잭션만이 점유하여 다른 작업에서 테이블을 사용하지 못하게 만든다!
-
격리 수준은 트랜잭션 실행 중 다른 작업이 참조가능한 경우에 따라 4가지로 분리되며, 설정가능하다.
-
Serializable(=엄격)
트랜잭션 작업이 끝나기 전까지 아무도 건들지 못하게 설정
-
Repeatable reads(=권장)
트랜잭션 순서에서 자기보다 높은(늦게 시작한) 트랜잭션의 작업을 무시하도록 설정 => 트랜잭션이 실행되기 전의 데이터 상태를 저장해두어 그 데이터에서만 트랜잭션 작업이 진행되도록 함
-
Read committed(=기본)
다른 트랜잭션의 작업이 진행된 이후의 값만 읽을 수 있도록 설정
-
Read uncommitted(=주의)
다른 트랜잭션의 작업이 진행된 이전의 값도 읽을 수 있도록 설정
-
격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
---|---|---|---|
Read Uncommitted | 허용 | 허용 | 허용 |
Read Committed | 방지 | 허용 | 허용 |
Repeatable Read | 방지 | 방지 | 허용 |
Serializable | 방지 | 방지 | 방지 |
-
주요 트랜잭션 문제
-
Dirty Read (드릅게 읽기)
다른 트랜잭션에서 커밋되지 않은 데이터를 읽는 문제
하나의 트랜잭션이 데이터를 수정했지만 롤백되었을 경우, 잘못된 데이터를 읽을 수 있음
-
Non-Repeatable Read (비반복 읽기)
동일한 트랜잭션 내에서 같은 데이터를 여러 번 조회할 때 값이 다르게 나타나는 문제
트랜잭션 A가 데이터를 읽고 있는 동안 트랜잭션 B가 해당 데이터를 수정하거나 삭제하는 경우
-
Phantom Read (환상 읽기)
동일한 쿼리를 두 번 이상 실행했을 때 처음에는 없던 데이터가 두 번째 실행 결과에서 나타나는 문제
트랜잭션 A가 특정 조건에 맞는 행을 조회하는 동안 트랜잭션 B가 새로운 행을 삽입했을 때 발생
-
영속성(Durability)
트랜잭션 실행으로 데이터에 변경된 사항이 저장되도록 보장해줌 => 오류가 나도 성공적으로 작업된 결과는 실행로그에 남으며, 복원을 시작함