트랜잭션
은행의 ATM이나 데이터베이스 등의 시스템에서 사용되는
더 이상 쪼갤 수 없는 업무 처리의 최소 단위이다.
트랜잭션 처리가 정상적으로 완료된 경우 커밋(commit)을 하고,
오류가 발생할 경우 원래 상태대로 롤백(rollback)을 한다.
목적
트랜잭션은 데이터베이스 서버에 여러 개의 클라이언트가 동시에 액세스 하거나
응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등
데이터 부정합을 방지하고자 할 때 사용한다.
트랜잭션의 특성(ACID)
트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적인 단위로
사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위이다.
하나의 트랜잭션은 커밋(commit) 되거나 롤백(rollback)이 된다.
데이터베이스의 트랜잭션이 안전하게 수행되기 위해서는 ACID조건을 충족해야한다.
Atomicity(원자성)
- 원자성(atomicity)은 하나의 트랜잭션이 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위
- 트랜잭션이 데이터베이스에 모두 반영되던지, 아니면 전혀 반영되지 않아야 함
➜ 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장한다는 것(All or Nothing)
ex) 100개의 작업 중 99개의 작업이 성공하고 1개가 실패했다면, 이는 무조건 실패로 간주하여 트랜잭션
시작 전 상태로 돌려야 한다.
➜ 원자성을 지니게 된 이유 : 중간에 끊기게 되면 이후 해당 트랜잭션의 어디서부터 이어서 수행되어야 하는지 모르기 때문 - 원자성 보장 : 트랜잭션에서 원자성은 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서, 이전에 커밋된 상태를 임시 영역에 따로 저장함으로써 보장한다.
✔ 롤백 세그먼트(rollback segment) : 이전 데이터들이 임시로 저장되는 영역
✔ 데이터베이스 테이블 : 현재 수행하고 있는 트랜잭션에 의해 새롭게 변경되는 내역
트랜잭션은 롤백 세그먼트에 의해 보장된다고 할 수 있음.
트랜잭션의 길이가 길어지게 되면 확실한 부분에 대해서는 롤백이 되지 않도록 중간 저장 지점인
세이브포인트(save point)를 지정할 수 있음. 세이브 포인트를 지정하게 되면 롤백할 때 세이브 포인트 이전은 확실하다가 간주하고 그 이후부터 진행.
Consistency(일관성)
- 일관성(consistency)은 트랜잭션이 완료된 결괏값이 일관적인 DB상태를 유지하는 것을 의미한다.
- 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 트랜잭션을 진행하는 것이 아니라, 처음 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행한다.
- 일관성 보장 : 트랜잭션 수행 전/후에 데이터 모델의 모든 제약 조건(기본 키, 외래 키, 도메인, 도메인 제약조건 등)을 만족하는 것을 통해 보장
➜ 한쪽의 테이블에서만 데이터 변경사항이 이루어져서는 안 됨
✔ 트리거(Trigger) : 데이터베이스 시스템이 자동적으로 수행할 동작을 명시 할 때 사용. 트리거를 통해 일관성을 보장.
Isolation(고립성, 격리성)
- 고립성(isolation)이란 하나의 트랜잭션 수행 시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것.(충돌 방지)
➜ 트랜잭션끼리는 서로를 간섭할 수 없음.
➜ 트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못하게 하는 특성 - 한 트랜잭션에서 데이터베이스를 변경한 내용은 트랜잭션이 커밋되기 전까지는 다른 어떤 질의나 트랜잭션과도 고립되어야 함.
➜ 각 트랜잭션은 시스템 내에서 동시에 수행되고 있는 다른 트랜잭션들을 알지 못함.
이 성질이 지켜지지 않으면 트랜잭션이 원래 상태로 되돌아갈 수 없음. - DBMS의 병행 제어 모듈이 트랜잭션의 고립성을 보장.
➜ ex)
하나의 트랜잭션이 A라는 계좌에서 작업을 하고 있을 경우 다른 트랜잭션이 A계좌에 참조하거나 관여할 수 없고 작업이 끝날 때까지 대기해야 함. - 고립성 보장 :
✔ lock&excute unlock : OS의 세마포어와 유사한 개념
데이터를 읽거나 쓸 때, 해당 데이터에 대해 잠금을 걸어서 다른 트랜잭션이 접근하지 못하도록 함.
작업을 마치면 잠금을 해제하여 다른 트랜잭션이 접근할 수 있게 함.
✔ 공유락(shared lock) : 데이터를 읽을 때는 여러 트랜잭션이 동시에 읽을 수 있도록 하는 것.
데이터를 읽을 수만 있고 수정은 불가능하다.
✔ 배타 락(exclusive lock) : 데이터를 쓸 때는 다른 트랜잭션이 읽거나 쓸 수 없도록 하는 것.
해당 데이터에 대해 독점적으로 접근하여 수정할 수 있게 한다.
잠금(lock)과 잠금해제(unlock)를 잘못 사용하면 "데드락(deadlock)"이라는 상태에 빠질 수 있음.
데드락(deadlock) : 모든 트랜잭션이 아무런 작업도 수행할 수 없는 상태.
Durability(지속성, 영속성)
- 트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 함.
- 지속성(durability)은 트랜잭션의 성공 결과 값은 장애 발생 후에도 변함없이 보관되어야 한다는 것을 의미
- 정장적으로 완료 혹은 부분 완료된 데이터는 DBMS가 책임지고 데이터베이스에 기록하는 성질이 지속성이며 영속성이라고 표한하기도 한다.
트랜잭션의 상태
트랜잭션에는 사용자가 적은 쿼리문과 데이터를 최종적으로 데이터베이스에 반영하는 커밋과
실패했을 때 시점으로 다시 되돌아가는 롤백이 있다.
- 활동(Active) : 트랜잭션이 실행 중인 상태
- 실패(Failed) : 트랜잭션이 실행에 오류가 발생하여 중단된 상태
- 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태
- 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, 커밋 연산이 실행되기 직전의 상태
- 완료(Committed) : 트랜잭션이 성공적으로 종료되어 커밋 연산을 실행한 수의 상태
트랜잭션의 연산
- 커밋
✔ 커밋(commit) 연산은 모 든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로서, 데이터베이스에 영구적으로 저장하는 것.
✔ 모든 과정이 오류 없이 수행되었다면 지금까지 실행한 모든 작업을 데이터베이스에 영구 저장하라는 명령으로 커밋을 수행한다. - 롤백
✔ 롤백(rollback) 연산은 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어.
일부가 정상적으로 처리되더라도 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소한다는 특징이 있음.
✔ 마지막 커밋을 완료한 시점으로 다시 돌아감.
✔ 롤백 시에는 해당 트랜잭션을 재시작하거나 폐기한다.
✔ all or nothing 방식으로 DML 명령어들을 처리. - 세이브 포인트
✔ 세이브포인트(save point)는 "임시저장" 또는 "부분저장"과 같은 맥락으로 이해할 수 있음.
✔ 전체가 아닌 특정 부분에서 트랜잭션을 취소하기 위해 사용.
✔ 현재의 트랜잭션을 작게 분할하는 것이 가능.
참고 - 해시넷 -
'데이터베이스 탐구' 카테고리의 다른 글
데이터베이스) JDBC 와 MyBatis(SQL Mapper) (0) | 2024.07.12 |
---|---|
데이터베이스) RDB와 NoSQL (2) | 2023.07.31 |
SQL) DROP, TRUNCATE, ALTER (0) | 2023.05.01 |
MySQL) 인텔리제이에서 테이블 만들어보기 (0) | 2023.05.01 |
프로그래머스) (mySQL) 가장 비싼 상품 구하기 (0) | 2023.04.30 |