허허의 오늘은 뭐 먹지?
DB Transaction의 ACID와 Isolation Level 본문
Transaction이란 DBMS에서 데이터를 다루는 논리적인 작업의 단위이다.
Transcation ACID
1. Atomicity (원자성) : 한 Transaction의 작업은 전부 수행되거나 전부 수행되면 안 됨
2. Consistency (일관성) : Transaction의 수행 전/후에서 DB는 항상 일관된 상태여야 함 (업데이트한 데이터의 합이 전과 후에 달라지지 않아야 함 등)
3. Isolation (고립성) : 수행 중인 Transactino에 다른 Transaction이 끼어들어 변경하려는 데이터 값이 의도치 않게 변경되면 안 됨
4. Durability (지속성) : Transaction 수행 후 변경한 데이터는 영구적으로 저장되어야 함
Isolation Level
ACID를 다 지키면 동시성이 매우 떨어지기 때문에 이를 희생해서 동시성을 얻는 방법이다. (아래로 갈수록 더 높은 레벨임)
1. READ UNCOMMITTED
- 아직 COMMIT되지 않은 값을 읽어올 수 있음.
2. READ COMMITTED
- PostgreSQL의 기본값
- COMMIT된 데이터만 보이는 수준을 보장함. READ시마다 SNAPSHOT을 뜸, Gap lock을 사용하지 않음.
- ex. SELECT * FROM TABLE WHERE ID BETWEEN 3 AND 10 FOR UPDATE; 로 했을 때
3에서 10을 모두 lock잡지 않고, 값이 존재하는 row에만 record lock을 걸음.
따라서 transcation이 여러개 실행되었을 때도 존재하지 않는 값은 insert가 가능하며
insert가 commit되면 select에 반영됨
3. REPEATABLE READ
- MySQL의 기본값
- 반복해서 READ를 수행하더라도 READ한 값이 바뀌지 않음을 보장함.
- READ할 때의 시점을 저장하고 있다가, 다음 번 READ요청시 가장 처음의 SNAPSHOT을 보여주게 함. Gap lock사용.
4. SERIALIZABLE
- 아래와 같은 순서에서, timeout이 발생하게 됨
A SELECT (transaction1) -> B SELECT(transaction2) -> A Update(transaction1) -> B Update(transaction2)
- Dead lock이 자주 발생함
Isolation을 지키기 위해서 할 일
1. SELECT FOR UPDATE 사용
- SELECT FOR UPDATE하면 LOCK이 걸림.
다른 Transaction이 읽기를 시도할 때 기존 Transaction이 Commit 또는 Rollback이 될 때까지 기다림
2. UPDATE를 Transaction 맨 마지막에 한번에 처리 (어플리케이션에서 겹치지 않게 잘..)
3. Optimistic LOCK
- 테이블에 버전 필드를 추가해서 SELECT할 때 가지고 오고
- UPDATE할 때 WHERE절에 버전을 명시하고, 버전은 기존 버전 + 1로 업데이트를 시도함
- 만약에 UPDATE된 레코드 수가 0개라면 다른 Transaction에서 변경한 것임
- Transaction의 Rollback은 어플리케이션에서 알아서..
'SW > 자세히 알아보기' 카테고리의 다른 글
[JAVA] JAVA는 Call by Value일까 Call By Reference일까? (0) | 2021.05.31 |
---|---|
[JAVA] 반복문 vs stream vs parallelStream 중 뭐가 제일 빠를까? (7) | 2021.05.03 |
메시지큐는 어떻게 사용하는가? (0) | 2021.04.25 |
[JAVA] String 특징과 Flyweight 패턴 (0) | 2021.04.22 |