본문 바로가기

# 03/RDBMS

트랜잭션

반응형

트랜잭션(Transaction)

복수 쿼리를 한 단위로 묶은 것.


ACID 특성

1. Atomicity (원자성)

2. Consistency (일관성)

3. Isolation (고립성 또는 격리성)

4. Durability (지속성)


- 원자성

원자성이란 데이터의 변경을 수반하는 일련의 데이터 조작이 전부 성공할지 전부 실패할지를 보증하는 구조이다.

하나의 트랜잭션을 처리하기 위해 4가지 단계가 있다고 하자. 이 4가지 단계를 모두 성공한 경우 'COMMIT'을 실행해 처리를 확정한다. 이 경우 각 데이터의 조작은 영구적으로 저장되어 결과가 손실되지 않는다. 단, 이 4가지 단계중 하나라도 오류가 발생하면 'ROLLBACK'을 실행해 첫번째 단계의 직전 상태까지 되돌아갈 수 있다.


- 일관성

데이터베이스에는 데이터베이스 오브젝트(테이블을 비롯해 데이터베이스 내에 정의할 수 있는 오브젝트)에 대해 각정 정합성 제약을 추가할 수 있다. 이는 일련의 데이터 조작 전후에 그 상태를 유지하는 것을 보증하는, 즉 일관성을 유지하기 위한 구조이다. 예를 들면, 시스템에 사용자를 등록할 때 사용자를 임의로 식별하기 위해 일련번호를 사용자에게 발급한다. 이 때 이번호에 유니크 제약을 설정하면 중복된 사용자 번호를 저장할 수 없다. 이것은 복수의 사용자가 동시에 사용자 번호를 취득하려는 경우에도 마찬가지다.


- 고립성

일련의 데이터 조작을 복수 사용자가 동시에 실행해도 각각의 처리가 모순없이 실행되는 것을 보증한다는 것이다. 데이터베이스에는 데이터베이스 오브젝트인 테이블에 대해 '잠금(Lock)'을 걸어서 후속 처리를 블록(Block)하는 방법이다. 잠금 단위에는 테이블 전체, 블록, 행 등이 있는데, MySQL에서는 트랜잭션 처리를 할 때 주로 행 단위의 잠금 기능을 이용한다.


DBMS 격리 수준(Transaction Isolation Level) - ANSI가 정의하였고 MySQL에 해당한다.

1. 커밋되지 않은 읽기(Read Uncommitted, 리드 언커밋티드)

2. 커밋된 읽기(Read Committed, 리드 커밋티드)

3. 반복 읽기(Repeatable Read, 리피터블 리드)

4. 직렬화 가능(Serializable, 시리얼라이저블)

> 4번 직렬화 가능이 가장 엄격하며 숫자가 작아질수록 완화된 격리 수준이다.


격리 수준의 완화에 따라 일어나는 현상

1. 더티 읽기(Dirty Read)

> 어떤 트랜잭션이 커밋되기 전에 다른 트랜잭션에서 데이터를 읽는 현상이다. 예를 들면, 사용자 A가 값을 변경하고 아직 커밋하지 않아도 사용자 B가 변경한 후의 값을 읽는 것을 가리킨다. 사용자 A가 빈 싱글룸 수가 '10'인 레코드를 '9'로 변경한 경우 커밋 전이라 하더라도 사용자 B가 SELECT한 결과는 '9'가 된다. 확정 전의 '더렵혀진(Dirty)' 데이터를 읽는것에서 붙여진 이름이다.

> 커밋되지 않은 읽기에서 나타난다.

2. 애매한 읽기(Fuzzy/NonRepeatable Read)

> 어떤 트랜잭션이 이전에 읽어 들인 데이터를 다시 읽어 들일 때 2회 이후의 결과가 1회 때와 다른 현상이다. 예를 들면, 최초에 사용자 A가 빈 싱글룸 수 '10'을 읽고 그 후 사용자 B가 값을 '9'로 변경해 커밋했다고 하자. 계속해서 사용자 A가 SELECT를 다시 실행하면 최초에 SELECT했던 '10'이 아닌 변경 후의 '9'를 읽어 들이게 된다. 사용자 A가 최초에 읽은 값 '10'이 2회 이후의 SELECT에서 보증되지 못하고 애매하게(Fuzzy) 되는 것에서 붙여진 이름이다. DBMS 매뉴얼에서는 '반복 불가능한 읽기(NonRepeatable Read)'로 소개하는 경우도 있다.

> 커밋되지 않은 읽기, 커밋된 읽기 에서 나타난다.

3. 팬텀 읽기(Phantom Read)

> 어떤 트랜잭션을 읽을 때 선택할 수 있는 데이터가 나타나거나 사라지는 현상이다. 최초에 사용자 A가 범위 검색(예를들어, 빈 싱글룸 수가 10 이상의 호텔)을 수행 후 3행을 읽었다고 가정하자. 계속해서 사용자 B가 막 그 범위에 들어가는 데이터 1행을 INSERT하고 커밋도 실행했다. 계속해서 사용자 A가 다시 같은 SELECT문을 실행하면 최초에 SELECT해서 얻었던 3행이 아닌 4행이 선택된다. 이처럼 나타나거나 사라지는 데이터가 '유령(Phantom)'과 닮아서 붙여진 이름이다.

> 직혈화 가능 빼고 모든 수준에서 나타난다.


- 지속성

일련의 데이터 조작을 완료하고 완료 통지를 사용자가 받는 시점에서 그 조작이 영구적이 되어 그 결과를 잃지 않는 것을 나타낸다. 이것은 시스템이 정상일 때만이 아니라 데이터베이스나 OS의 이상 종료, 즉 시스템 장애도 견딜 수 있다는 뜻이다. MySQL을 포함해 많은 데이터베이스의 규현에서는 트랜잭션 조작을 하드 디스크에 '로그'로 기록하고 시스템에 이상이 발생하면 그 로그를 사용해 이상 발생 전의 상태까지 복원하는 것으로 지속성을 실현하고 있다.


SQL문은 DBMS에 줄 수 있는 명령의 종류에 따라 3가지로 구분된다.

1. 데이터 정의 언어(DDL, Data Definition Language)

 > 데이터를 저장하는 스키마(데이터베이스) 또는 테이블 등을 작성하거나 제거한다. 'CREATE(데이터베이스나 테이블의 작성)'외에 'DROP(제거)' 'ALTER(변경)' 등이 있다.

2. 데이터 조작 언어(DML, Data Manipulation Language)

 > 테이블의 행을 검색하거나 변경하는 데 사용할 수 있다. DML로 구분된 명령에는 SELECT, INSERT, UPDATE, DELETE 등이 있다.

3. 데이터 제어 언어(DCL, Data Control Language)

 > 데이터베이스에서 실행한 변경을 확정하거나 취소하는데 사용한다. 'COMMIT'이나 'ROLLBACK'은 DCL의 일종이다. 

> 실무에서 사용하는 SQL문 대부분은 DML이다.


다른 커넥션에서 테이블을 본다.

기본적으로 DDL에 따른 테이블 작성과 DML에 의한 데이터 저장은 트랜잭션이 커밋되기 전까지는 다른 커넥션에서 보이지 않는다. 그런데 이에 상관없이 다른 커넥션에서도 보이는 이유가 있다.

1. DDL에 따른 암묵적인 커밋

> MySQL이나 Oracle에서는 CREATE TABLE과 같은 DDL 실행 시 암묵적인 커밋이 발행한다. 이 때문에 한 개의 커넥션에서 실행된 CREATE TABLE이 성공하면 그 이후에는 다른 커넥션에서도 참조 할 수 있게 된다.

2. 오토커밋 설정

> 트랜잭션의 개시(BEGIN TRANSACTION, START TRANSACTION, SET TRANSACTION)가 명시적으로 지정되지 않았을 때 트랜잭션을 구별하는 방법으로 다음 2가지 모드가 있다.

 - 하나의 SQL 문이 하나의 트랜잭션으로 구분된다.(오토커밋)

 - 사용자가 COMMIT 또는 ROLLBACK을 실행하기 까지가 하나의 트랜잭션이 된다.

> 일반적인 DBMS에서는 어느 모드도 선택할 수 있다. 기본 설정이 오토커밋 모드인 DBMS에는 MySQL, PostgreSQL, SQL Server 등이 있다.

반응형

'# 03 > RDBMS' 카테고리의 다른 글

Oracle  (0) 2019.02.15
MVCC에 따른 MySQL의 특성  (0) 2019.02.11
뷰의 작성과 서브쿼리 및 결합  (0) 2019.02.11
SQL문의 기본  (0) 2019.02.11
DBMS를 조작할 때 필요한 기본지식  (0) 2019.02.11