ACID, 거의 대부분의 개발자들이 면접을 받기전에 숙지하고 들어가는 키워드가 아닐까 싶다.
ACID는 각각 원자성(Atomic), 일관성(Consistency), 고립성(Isolation), 지속성(Durablity)의 함축된 단어이다.
이 각각의 특징은 다음을 의미한다.
- 원자성(Atomic)
트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다. 즉, 하나의 트랜잭션에 속한 작업들은 전부 수행되거나 전부 수행되지 않아야 한다. - 일관성(Consistency)
트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성있는 데이터베이스 상태로 유지하는 것을 의미한다. 예를들면, 모든 계좌는 잔고가 있어야하며 이를 어길경우 트랜잭션은 중지되어야 한다. - 고립성(Isolation)
트랜잭션을 수행시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. - 지속성(Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.
트랜잭션 격리레벨이란?
트랜잭션 격리레벨은 위에서 나오는 ACID중에서 I에 해당하는 Isolation의 레벨을 조정하는 것을 뜻한다.
격리레벨이 높아질수록 격리성은 높아지지만 성능이 안나온다는 단점이 있고,
그와 반대로 격리레벨이 낮아질수록 성능은 잘나오지만 격리성은 낮아지는 단점이 있다고 한다.
격리레벨은 크게 아래와같이 나눌 수 있다.
- UNCOMMITTED-READ
- COMMITED-READ
- REPEATABLE READ
- SERIALIZABLE
각 레벨별 특징
READ-UNCOMMITTED (트랜잭션 레벨0)
- DIrty Read발생가능한 레벨
- 트랜잭션 커밋이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상
set transaction_isolation = 'READ-UNCOMMITTED'
READ COMMITED (트랜잭션 레벨1)
- UnRepeatable Read가 발생가능한 레벨
반복적인 조회작업에서 다른 트랜잭션에서 데이터가 변경되는 경우, 조회시 데이터가 일치하지 않는 경우가 발생하는 경우이다.
set transaction_isolation = 'READ-COMMITTED'
REPEATABLE READ (트랜잭션 레벨 2)
- Phantom Read가 발생 가능
데이터 변경, 삭제가 불가능하지만 데이터 추가가 가능하기 떄문에, 다른 트랜잭션에서 데이터가 추가되는 경우, 조회시 데이터 불일치가 발생할 수 있따.
set transaction_isolation = 'REPEATABLE-READ'
SERIALIZABLE READ (트랜젝션 레벨 3)
트랜잭션이 테이블을 읽은 경우, 해당 테이블에 다른 트랜잭션이 데이터 변경, 삭제, 추가작업을 하지 못하도록 막아서 완벽한 일관성을 제공한다.
set transaction_isolation = 'SERIALIZABLE-READ'