데이터베이스 용어 트랜잭션에 대해 알아보자 ❕
1. 트랜잭션(Transaction)이란?
트랜잭션은 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다. 데이터베이스의 상태는 SQL쿼리를 실행시켜 변경시킬 수 있는데, 사용자가 특정 기능의 수행을 위해 SQL 작업을 묶은 단위를 트랜잭션이라고 하는 것이다. 따라서 트랜잭션에는 여러개의 연산이 수행될 수 있다.
대표적인 예로, 계좌 간의 이체 상황을 들 수 있다. A계좌에서 B계좌에게 10만원을 이체한 경우
- A계좌에서 10만원이 출금되고
- B계좌에서는 10만원이 입금되어야 한다.
만약 A계좌에서 10만원이 출금되었는데 B계좌에서 10만원이 입금되지 않으면 문제가 발생한다.
또 다른 예시를 들어보자. 쇼핑몰의 상품 재고를 나타내는 재고시스템에서 상품 A가 1개 출고되었다면
- 상품의 출고 데이터 생성 (+1)
- 상품의 재고 수량 변경 (-1)
과 같이 두 작업이 모두 실행되어야 올바른 출고 데이터와 재고 데이터가 표시된다.
만약 1번은 성공했는데 2번은 실패한다면, 상품 A의 재고 수량이 실제보다 1개 더 많아져 버린다.
위 예시들에서 두 작업은 동시에 성공되거나 동시에 실패되어야 하며 (all or nothing), 하나의 작업으로 묶어서 관리해야 한다.
이런 두 과정을 묶는 방법이 트랜잭션이다. 트랜잭션으로 여러 작업을 묶었다면, 일부는 성공하고 일부는 실패된 경우 해당 작업을 전체 취소시킬 수 있다.
2. 트랙잭션 연산
DB에서 트랜잭션을 사용하면 커밋(commit)과 롤백(rollback)으로 작업을 반영하거나 취소할 수 있다. 또한, 저장점(savepoint)으로 특정 지점까지 되돌릴 수도 있다.
- 커밋 (commit)
- 작업이 성공적으로 완료된 것
- commit 후에는 데이터베이스 상태가 변경됨
- 롤백 (rollback)
- 작업 중 하나라도 실패해서 이전으로 되돌리는 것
- 마지막 commit 시점으로 되돌아간다.
- DDL문(CREATE, DROP, ALTER, RENAME, TRUNCATE)은 트랜잭션의 롤백 대상이 아니다
- 저장점 (savepoint)
- 트랜잭션을 분할하는 작업 (임시 저장, 부분 저장)
- 특정 지점으로 롤백 할 수 있도록 한다.
커밋을 호출하기 전까지는 데이터를 임시로 저장하기 때문에 해당 트랜잭션을 시작한 *세션에게만 변경 데이터가 보이고 다른 세션에게는 변경 데이터가 보이지 않는다.
* DB 커넥션, DB 세션?
사용자가 DB 서버에 접근하려면, 사용자는 DB 서버에 연결을 요청하고 커넥션을 맺게 된다. 커넥션이 완료된 클라이언트는 세션을 통해 SQL 요청을 실행시킬 수 있다.
커넥션 : DB와 클라이언트 간의 TCP 소켓을 통한 물리적인 연결. Client가 DB에 접속하려면 먼저 커넥션을 만들어야 한다. 한 커넥션에서 여러 개의 트랜잭션을 동시에 실행시킬 수 없다.
세션 : DB와 클라이언트 간의 논리적인 연결이며, 커넥션이 성공적으로 만들어진 이후의 상호작용을 나타낸다. Client가 DB에 로그인하여 커넥션을 생성하면 그에 대한 세션도 생성된다. 세션은 사용자의 DB 작업이 이루어지는 동안 유지되고 사용자가 로그아웃하면 종료된다. 커넥션을 통한 모든 요청은 세션을 통해서 실행되며, 커넥션 하나 당 여러 개의 세션을 가질 수 있다.
3. 트랜잭션 상태
- 실행(active) : 트랜잭션 실행중인 상태
- 부분 완료(partially committed) : 트랜잭션의 명령을 실행한 후의 상태. 아직 commit 연산이 실행되기 전의 상태
- 완료(committed) : commit 연산을 실행시켜 트랜잭션이 성공적으로 완료된 상태
- 실패(failed) : 트랜잭션 실행에 오류가 발생한 상태
- 철회(aborted) : 트랜잭션이 비정상적으로 종료되어 이전 상태로 돌아간 상태. rollback된 상태
4. 트랜잭션 성질
트랜잭션은 ACID 성질을 가지고 있다. 트랜잭션이 안전하게 수행된다는 것을 이 4가지 성질로 보장한다.
- 원자성(Atomicity) : 트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 한다.
- 일관성(Consistency) : 트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다. (데이터베이스 유효성을 지켜야 한다)
- 격리성, 독립성(Isolation) : 둘 이상의 트랙잭션이 동시에 실행되었더라도 다른 트랜잭션에 영향을 받지 않고 독립적으로 실행되어야 한다.
- 영구성, 지속성(Durability) : 트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 한다.
5. 실습
MySQL에서 트랜잭션을 사용해보자
- MySQL은 디폴트로 *auto commit이 ON으로 설정되어있는데,
set autocommit = 0
을 실행시켜 OFF로 변경할 수 있다.
* auto commit (자동 커밋) ?
사용자가 쿼리 실행 직후에 commit 명령을 하지 않아도 즉시 반영되는 것을 말한다. auto commit을 설정해두면 모든 실행마다 commit 명령을 생략해도 된다는 장점이 있지만 쿼리 실행 후에는 롤백하지 못한다는 단점도 있다.
1. rollback, commit 사용
- 트랜잭션 시작 후, member를 조회한다.
- mebmer의 name이 '이름'인 데이터를 제거한 후, member를 조회하면 정상적으로 제거된 것을 확인할 수 있다.
- rollback을 실행시킨 후 member를 조회하면 처음 member 상태로 되돌아간다.
- commit을 실행시킨 후 member를 조회하면 삭제된 그 member는 조회되지 않는다.
2. savepoint 사용
- 트랜잭션을 시작한 후, member를 조회한 결과이다.
- member의 이름을 '기름' -> '갸름'으로 변경시킨 후, member를 조회하면 정상적으로 변경된 것을 확인할 수 있다.
- 그 다음 savepoint를 생성해 현재 상태를 저장한다.
- name이 '갸름'인 데이터를 제거한 후, member를 조회하면 정상적으로 제거된 것을 확인할 수 있다.
- rollback to로 방금 저장했던 savepoint로 되돌린다.
- 그 다음 member를 조회하면 제거된 '갸름'이 되살아 났고, 데이터가 다시 point1 상태로 되돌아간 것을 확인할 수 있다.
- 마지막으로 rollback을 실행시키고, member를 조회하면 name이 변경되기 전(transaction을 실행시키기 전) 상태로 되돌아간 것을 확인할 수 있다.
참고자료 😃
https://inpa.tistory.com/entry/MYSQL-📚-트랜잭션Transaction-이란-💯-정리
https://hstory0208.tistory.com/entry/트랜잭션이란-특징과-사용법에-대해-쉽게-알아보자
https://cotak.tistory.com/310
https://d2.naver.com/helloworld/407507
https://loosie.tistory.com/527
https://mangkyu.tistory.com/30
'DB' 카테고리의 다른 글
[DB] B-Tree, B+Tree - DB Index (0) | 2024.04.18 |
---|---|
[DB] NoSQL (NotOnly SQL) (1) | 2024.03.28 |
[DB] 데이터베이스 정규화 (Normalization) (1) | 2024.03.26 |
[DB] 트랜잭션 격리수준 (Transaction Isolation) (0) | 2024.03.15 |
[DB] 인덱스 (index) (1) | 2024.03.10 |