트랜잭션 ?
트랜잭션은 데이터베이스에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위이다. 여러 개의 명령어의 집합이 정상적으로 처리되면 정상 종료되며 하나의 명령어라도 잘못되면 전체가 롤백된다.
트랜잭션을 사용하는 이유
데이터의 일관성을 유지하면서 안정적으로 데이터를 복구하기 위함이다. 데이터베이스에선 테이블에서 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는데 처리 도중 오류가 발생하면 모든 작업을 원상태로 되돌린다. 처리 과정이 모두 성공했을 때만 최종적으로 데이터베이스에 반영한다.
락(Lock)
트랜잭션을 사용하는 이유가 전체 단위를 롤백만 하기 위한 것은 아니다. DB 락이라는 것이 있는데 여러 사용자가 동일한 데이터를 액세스할 때 작업이 순차적으로 처리되도록 함으로써 일관성과 정합성을 보장할 수 있다.
Lock종류는 두 종류가 있다.
- Exclusive Lock
- Exclusive Lock은 데이터를 변경하고자 할 때 사용되며 트랜잭션이 완료될 때까지 유지된다.
- Exclusive Lock는 해제될 때까지 다른 트랜잭션(읽기 포함)이 해당 리소스에 접근할 수 없다. 또한 해당 Lock은 다른 트랜잭션이 수행되고 있는 데이터에 대해서는 접근하여 함께 Lock을 설정할 수 없다.
- Write Lock이라고도 불린다.
- Shared Lock
- Shared Lock은 데이터를 읽을 때 사용되어지는 Lock이다.
- Shared Lock 끼리는 동시에 접근이 가능하다. 즉, 동시에 여러 사용자가 수정은 할 수 없지만 데이터를 읽을 수는 있다. 하지만 Shared Lock이 설정된 데이터에 베타 Lock을 사용할 수는 없습니다.
- Read Lock이라고도 불린다.
즉, DBMS에서는 락을 통해 동시성을 제어하게 된다. 이때 락의 범위를 비즈니스에서 필요한 최소한으로 설정하는 것이 중요하다.
- 락을 너무 넓게 가져가면 쉽게 일관성과 정합성이 보장되지만 대기하는 DB 커넥션이 많아지므로 커넥션풀 고갈로 이어질 수 있다.
(MySQL에서는 트랜잭션의 커밋 혹은 롤백 시점에 잠금이 풀린다. 트랜잭션이 곧 락의 범위가 된다.)
- 즉, 트랜잭션의 범위를 최소화하는 것이 락의 범위를 최소화하는 것이 된다.
트랜잭션의 특징
트랜잭션에게는 대표적으로 4가지의 특징이 있다. 통칭 ACID라고 부른다.
- 원자성(Atomicity)
- 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다.
- 트랜잭션이 DB에 모두 반영되거나 전혀 반영되지 않거나이다. 즉, All or Nothing을 의미한다.
- 일관성(Consistency)
- 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다.
- 만약, 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단된다.
- 독립성(Isolation)
- 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다.
- 이것은 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다. 제 3자가 도중에 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽 데이터에 접근할 수 없다.
- 지속성(Durability)
- 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다. 즉, 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 함을 의미한다.
- 전형적으로 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.
가치
ACID 트랜잭션은 최대한의 데이터 안정성과 무결성을 보장한다. 작업 하나가 일부분만 완료되는 바람에 데이터가 일관적이지 않은 상태가 되는 불상사가 절대로 일어나지 않게 해준다는 뜻이다.
가령, ACID 트랜잭션이 없다고 가정하면 데이터베이스 테이블에 몇몇 데이터를 쓰던 중에 예기치 못하게 정전이 되면 데이터 중 일부는 저장이 되고 일부는 저장되지 않는 사태가 발생할 수 있다. 그러면 데이터베이스는 일관성 없는 상태가 되어 복구하기 어렵고 난해하게 된다.
Reference
'Database > SQL' 카테고리의 다른 글
Real MySQL - Limit, Offset 절의 동작 원리! (+ No Offset 성능 비교) (0) | 2022.06.26 |
---|---|
Real MySQL - BETWEEN문 튜닝하는 방법! (with MySQL Server 8.0) (0) | 2022.06.26 |
MySQL - 커버링 인덱스 (0) | 2022.05.31 |
Real MySQL - 옵티마이저란 무엇인가 ? (+ 기본 데이터 처리) (0) | 2022.05.13 |
SQL - Using Temporary, Using Filesort 정리 (+ 임시 테이블, 파일 정렬) (0) | 2022.05.11 |