* 트랜잭션(Transaction)
* 트랜잭션이란?
: 복수 쿼리를 한 단위로 묶은 것.
갱신은 단일 쿼리만으로 구성된 것이 아니고 복수 쿼리를 연속적으로 수행하는 경우가 대부분이다.
또한, 갱신 전의 데이터로 SELECT를 사용할 때 이를 포함해 복수 쿼리를 일관된 형태의 한 덩어리로
다뤄야 한다.
* ACID 특성
1) Atomicity(원자성)
: 원자성이란 데이터의 변경(INSERT/DELETE/UPDATE)을 수반하는 일련의 데이터 조작이
전부 성공할지 전부 실패할지를 보증하는 구조이다.
예를 들어, 서울에서 부산으로 가는 기차를 예매하는 과정이 다음과 같다고 하자.
(1) 서울 -> 부산행 좌석을 선택한다.
(2) 해당 좌석을 예매한다.
(3) 대금을 지급한다.
-> 위의 절차가 모두 잘 진행되면 트랜잭션에서는 (1)~(3)를 처리한 후에 COMMIT을 실행해 처리를 확정한다.
이 경우 각 데이터의 조작은 영구적으로 저장되어 결과가 손실되지 않는다.
Q. 처리 도중에 오류가 발생한다면?
-> 만약, 좌석을 선택했지만 누군가가 먼저 그 좌석을 예매한 경우 혹은 돈이 부족해서 결제하지 못한 경우도 있을 수 있다. 이런 경우에는 'ROLLBACK'을 실행하여 (1)의 직전 상태까지 되돌아갈 수 있다. 또한 통신이 끊기거나 서버가 다운된 경우에도 COMMIT된 것 이외의 것들은 ROLLBACK을 해야 한다.
2) Consistency(일관성)
: 데이터베이스에는 데이터베이스 오브젝트(테이블을 비롯해 DB내에 정의할 수 있는 오브젝트)에 대해 각종
정합성 제약을 추가할 수 있다. 이는 일련의 데이터 조작 전후에 그 상태를 유지하는 것을 보증하는,
즉 '일관성'을 유지하기 위한 구조이다.
예를 들면, 시스템에 사용자를 등록할 때 사용자를 임의로 식별하기 위해 일련번호를 사용자에게 발급한다.
이때 이 번호에 유니크 제약(유일성 제약)을 설정하면 중복된 사용자 번호를 저장할 수 없다.
3) Isolation(고립성 또는 격리성)
: '고립성(격리성)'이란 일련의 데이터 조작을 복수 사용자가 동시에 실행해도
'각각의 처리가 모순없이 실행되는 것을 보증한다'는 것이다.
예를 들면, 서울의 지정 호텔에 남은 싱글룸 수가 10개였을 때
실제로 숙박한 흐름을 프로그래밍하듯이 표현하면 다음과 같다.
(1) 현재 빈 싱글룸의 수를 확인한다(SELECT)
(2) 빈 싱글룸 수에서 1을 빼고 결과를 빈 싱글룸 수로 되돌려 쓴다(UPDATE)
Q. 이것을 사용자 A와 사용자 B가 동시에 수행하면 어떻게 될까?
-> 2명이 방을 확보한다면 원래 빈 싱글룸 수는 2개가 줄어야 하지만, 같은 방을 동시에 확보하게 되면
빈 싱글름 수는 1개만 줄어들게 된다.
-> 이런 사태가 발생하는 것을 막기 위해 DB에는 데이터베이스 오브젝트인 테이블에 대해
'잠금(Lock)'을 걸어서 후속 처리를 블록하는 방법이 있다.
(잠금 단위에는 테이블 전체, 블록, 행 등이 있는데., MySQL에서는 트랜잭션 처리를 할 때
주로 행 단위의 잠금 기능을 이용한다.)
앞의 두 가지( (1),(2) )중 (1)번을 처리할 때 'SELECT ~ FOR UPDATE'를 실행하면 SELECT한 행에 잠금이 걸린다.
이렇게 되면 후속 처리는 해당 잠금이 해제될 때(COMMIT 또는 ROLLBACK)까지 대기하게 되며 올바른 처리를 계속 할 수 있다.
4) Durability(지속성)
: '지속성'은 일련의 데이터 조작을 완요(COMMIT)하고 완료 통지를 사용자가 받는 시점에서 그 조작이 영구적이 되어
그 결과를 잃지 않는 것을 나타낸다. 이것은 시스템이 정상일 때만이 아니라 DB나 OS의 이상 종료에도
견딜 수 있다는 뜻이다.
많은 데이터베이스의 구현에서는 트랜잭션 조작을 하드 디스크에 '로그'로 기록하고 시스템에 이상이
발생하면 그 로그를 사용해 이상 발생 전의 상태까지 복원하는 것으로 지속성을 실현하고 있다.
*이 포스트는 '데이터베이스 첫걸음'책을 참고하여 작성했습니다.
'데이터베이스 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] RAID 정리 (0) | 2021.05.14 |
---|---|
[데이터베이스] LVM(Logical Volume Manager) 정리 (0) | 2021.05.10 |
데이터베이스(데이터베이스(DB)의-관계형 데이터베이스의 계층) (0) | 2017.08.24 |
데이터베이스(데이터베이스(DB)의 아키텍처-Shared Disk & Shared Nothing) (0) | 2017.08.22 |
데이터베이스(데이버베이스(DB)의 아키텍처-리플리케이션) (1) | 2017.08.22 |