Transaction 이란?
트랜잭션이란 논리적 작업 단위로서 하나의 단위로 처리되어야 하는 분리될 수 없는 연산 그룹을 말합니다. 쉽게 말해 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위입니다.
상태를 변화시킨다는 것은 아래의 SQL(질의어)을 이용해 데이터베이스에 접근하는 것을 의미합니다.
- SELECT
- INSERT
- DELETE
- UPDATE
특징
ACID
- Atomicity 원자성 : 트랜잭션이 데이터베이스에 모두 반영되거나, 모두 반영되지 않아야 한다.
- Consistency 일관성 : 트랜잭션의 작업처리 결과가 항상 일관성이 있어야 한다.
- Isolation 독립성 : 두 개 이상의 트랜잭션이 동시에 실행되고 있을 경우에는 어느 하나의 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
- Durability 지속성 : 트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 한다.
Transaction Commit & Rollback
- Commit : 하나의 트랜잭션이 성공적으로 끝났음을 알리는 연산으로, 데이터베이스가 일관적인 상태에 있어야 한다.
- Rollback : 하나의 트랜잭션 처리가 비정상적으로 종료된 경우(트랜잭션의 원자성이 깨진 경우), 트랜잭션을 다시 시작하거나 부분적으로만 연산된 결과를 다시 취소한 후, 트랜잭션 처리 단위로 롤백 처리를 할 수 있다.
Transaction Isolation Level 트랜잭션 격리 수준
level | 옵션 | 설명 | 예시 |
---|---|---|---|
level 0 | READ_UNCOMMITTED | 트랜잭션에 처리 중이거나 아직 commit(확정) 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용 | 한 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 아직 완료되지 않은(Uncommitted or Dirty) 데이터 B'를 읽을 수 있다. |
level 1 | READ_COMMITTED | 트랜잭션이 commit 되어 확정된 데이터만을 읽는 것을 허용한다. (Dirty Read를 방지) | 한 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 해당 데이터에 접근할 수 없다. |
level 2 | REPEATABLE_READ | 트랜잭션이 완료될 때까지 SELECT 문이 사용하는 모든 데이터에 락(shared lock)이 걸린다. 다른 사용자는 그 영역에 해당 하는 데이터에 대한 수정이 불가능하다. | 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제하는 것을 불허함으로써 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결과를 반환한다. |
level 3 | SERIALIZABLE | 데이터의 일관성 및 동시성을 위해 MVCC를 사용하지 않는다. 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다. 즉, 완벽한 읽기 일관성 상태를 제공한다. |
- Dirty Read : 현재 트랜잭션에서 처리하는 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상을 dirty read 라고 하며, READ UNCOMMITTED 격리 수준에서만 일어나는 현상이다.
- MVVC(Multi Version Concurrency Control) : 다중 사용자 데이터베이스 성능을 위한 기술로 데이터 조회시 락을 사용하지 않고 데이터의 버전을 관리해 데이터의 일관성 및 동시성을 높이는 기술을 말한다.
'개발' 카테고리의 다른 글
GIT (1) (0) | 2024.09.09 |
---|---|
JedisExhaustedPoolException 이슈 (4) | 2024.09.08 |
Kafka 설정 값 (1) | 2024.09.08 |
NoSQL (0) | 2024.08.25 |
추천 시스템 (0) | 2024.08.25 |