트랜잭션(Transaction)이란
트랜잭션은 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위이다.
데이터베이스의 상태를 변화시킨다는 건 SQL 질의어를 이용하여 데이터베이스에 접근하는 것을 의미한다.
- SELECT
- INSERT
- DELETE
- UPDATE
트랜잭션에는 여러 개의 연산이 수행될 수 있다.
하나의 논리적인 작업 단위라고해서 하나의 연산만이 수행되어야하는 건 아니다.
작업 단위는 많은 질의어 명령문을 사람이 정하는 기준에 따라 정하는 것을 의미한다.
예로 게시글을 작성하고 등록 버튼을 누른다. 그 후 게시판을 보면 방금 작성한 글을 포함한 게시판을 보게 된다.
데이터베이스 작업으로 보자면 INSERT 문을 이용하여 작성한 게시글을 데이터베이스에 등록한다. 그런 후에 게시판의 게시글을 보기 위해 SELECT 문을 이용하여 글을 보게된다.
여기서의 작업 단위는 INSERT 문과 SELECT 문 둘 다를 합친 것이다.
이러한 작업 단위는 하나의 트랜잭션이 될 수 있다.
트랜잭션의 성질
트랜잭션의 성질은 크게 4가지로 구분할 수 있다. 4가지로 구분한 것을 ACID라고 부른다.
ACID는 트랜잭션이 안전하게 수행되는 걸 보장하기 위한 성질이다.
- Atomicity(원자성)
- 하나의 트랜잭션이 더 작게 나눌 수 없는 최소의 단위라는 뜻
- 트랜잭션이 모두 반영되거나, 전혀 반영되지 않아야 하는 특징을 나타낸다
- Consistency(일관성)
- 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 한다.
- 예를 들면, 고객 정보가 담긴 DB에 새로운 고객이 등록되면 그 DB를 참조하는 하위 계층의 DB도 같은 고객의 세부 정보를 가져와야 한다.
- Isolation(격리성)
- 트랜잭션 수행 시 다른 트랜잭션의 작업의 영향을 받지 않도록 보장하는 것을 말한다.
- 트랜잭션끼리는 서로 간섭할 수 없다.
- Durability(지속성)
- 성공적으로 수행된 트랜잭션은 커밋된 상태로 유지되는 것을 보장해야 한다.
- 시스템에 문제가 발생하거나 종료되더라고 DB에 반영된 값은 그대로 유지되어야 한다.
Rollback, Commit
Rollback
- 트랜잭션을 사용해 데이터를 추가하다 에러가 발생한다면 트랜잭션의 실행을 취소하고 트랜잭션이 수행한 결과를 원래 상태로 원상 복귀시키는 연산
Commit
- 한 작업의 논리적 단위가 성공적으로 끝나 트랜잭션의 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산
트랜잭션 격리 수준(Transaction Isolation Levels)
트랜잭션의 격리 수준이란 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지를 결정하는 것이다.
- 격리 수준에는 4가지가 있다.
- READ UNCOMMITTED
- 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있다.
- 격리 수준이 가장 낮음
- READ COMMITTED
- 다른 트랜잭션에서 커밋된 내용만 참조할 수 있다.
- REPEATABLE READ
- 트랜잭션에 진입하기 이전 커밋된 내용만 참조할 수 있다.
- SERIALIZABLE
- 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다.(성능 매우 떨어짐)
- 격리 수준이 가장 높다
- READ UNCOMMITTED
- 격리 수준이 낮을수록 더 많은 문제가 발생
- REPEATABLE READ 격리 수준에서는 phantom read가 발생할 수 있다. 하지만 InnoDB에서는 독특한 특성 때문에 REPEATABLE READ 격리 수준에서도 phantom read가 발생하지 않는다
- Oracle은 주로 READ COMMITTED를, MySQL은 REPEATABLE READ를 주로 사용
- 일반적인 서비스 DB에서는 READ COMMITTED 혹은 REPEATABLE READ 둘 중 하나의 전략을 사용한다
트랜잭션의 상태
- Active(활동 상태)
- 트랜잭션이 수행을 시작하여 현재 수행 중인 상태
- Partially Committed(부분 완료 상태)
- 마지막 연산이 실행된 직후의 상태, 연산은 모두 처리했지만 데이터베이스에 반영되지 않았다.
- Committed(완료 상태)
- 트랜잭션이 성공적으로 완료되어 Commit 한 상태
- Aborted(철회 상태)
- 수행에 실패하여 Rollback 연산을 실행한 상태
http://wiki.hash.kr/index.php/트랜잭션
https://tecoble.techcourse.co.kr/post/2021-07-11-database-transaction/
'데이터베이스' 카테고리의 다른 글
정규화의 종류 (1) | 2022.11.04 |
---|---|
정규화와 정규화가 필요한 이유 (2) | 2022.11.02 |