C.S/DB

DB 트랜잭션의 정의, 특징

칼쵸쵸 2021. 2. 28. 15:46

데이터베이스 트랜잭션

데이터베이스가 한번에 실행 되어야하는 논리적 연산의 집함

상호작용의 단위로써 성공과 실패가 분명하며 , 트랜잭션간에 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.

 

트랜잭션의 특징 (ACID)

1. 원자성 , Atomicity

- 트랜잭션의 작업들이 진행중에 중간에 중단되지 않는것을 보장

ex) 자금 이체시 보내기만 성공하고 받는 것은 실패하는 경우는 없다.

 

2. 일관성, Consistency

- 데이터베이스가 트랜잭션 이후에 기존의 데이터 베이스의 상태가 변경되거나 트랜잭션에 대한 데이터만 기존 데이터의 기준에 위배하는 다른 형식의 데이터를 가지고 있어서는 안된다.

ex) 모든 계좌는 잔금이 1원 이상 남아있어야 한다는 데이터베이스에서 자금 이체후 잔금이 0원이 될 수 없다.

 

3. 독립성, Isolation

- 트랜잭션이 실행 중에는 다른 트랜잭션이 동일한 데이터를 변경할 수 없다.

- 트랜잭션에 포함되지 않은 연산은 트랜잭션이 동작하는 중간단계의 데이터를 읽을 수 없다.

ex) 은행관리자가 이체되는과정에 다른 연산을 할 수도 없으며 자금이 이체되는 과정을 볼 수 없다.

 

4. 지속성 , Durability

- 트랜잭션이 동작을 완료한 후의 데이터는 영구히 변경된다.

- 시스템이 장애를 발생하거나 , 일관성 체크등의 이유로 트랜잭션 동작이 다시 취소 될 수 없다.

- 기본적으로 모든 트랜잭션은 로그를 남기며 commit되기 전의 상태로 되돌릴 수 있다. (rollback)

 

SAVE POINT , ROLLBACK TO

DB가 트랜잭션 중간에 실패, 또는 Commit 이전에 데이터베이스 변경을 사용자가 취소할 경우 해당 트랜잭션에 포함되는 insert, update, merge , delete등 DML연산이 전부 취소된다. 

이러한 상황을 방지하기 위해 트랜잭션 중간단계를 저장하여 해당 연산이 완료된 중간 시점을 돌아 갈 수 있다.

INSERT INTO USER VALUES(1,"hi");
SAVEPOINT fistpoint;
INSERT INTO USER VALUES(2,"hello");
SAVEPOINT secondpoint;

//2,"hello"가 삭제됨
ROLLBACK TO firstpoint;

 

동시성과 일관성

동시성 : DB는 모든 트랜잭션을 최대한 많이 동시에 동작하게 만들어 트랜잭션의 수행 성능을 높여야 한다.

- 일관성을 강화하여 모든 트랜잭션이 중간에 접근할 수 없게 만든다면 동시성이 떨어져 성능이 저하된다.

- 동시성을 강화하여 일관성이 떨어진다면 데이터베이스의 신뢰도가 떨어진다.

 

다중사용자 동시성 지원시 문제

[1] 하나의 트랜잭션은 읽고 나머지 트랜잭션은 읽을 때 발생하는 문제

1. 오손 읽기(Dirty Reading)

- 트랜잭션이 수행중 롤백되었는데 이를 롤백이 수행하기전에 다른 트랜잭션이 해당 데이터를 읽어서 생기는 문제

(Example)

1) 트랜잭션 1이 X=10 에 5 를 더하여 15로 만듦

2) 트랜잭션 1의 수행내용이 롤백되어야함

3) 롤백이 수행되기 이전에 트랜잭션 2개 X를 읽어 X=15로 읽음

4) 트랜잭션 1이 롤백되어 X=10이 됨

 

2. 반복 불가능한 읽기(Non-repeatable Read)

- 조회가 두번 동작하는데 다른 트랜잭션이 중간에 데이터를 수정하여 같은 조회동작의 내용이 달라지는 문제

(Example)

1) X=10을 2번 읽어오는 트랜잭션1 수행중 1번 읽었을때 트랜잭션 동작 변경

2) X+=5를 수행하는 트랜잭션 2 수행

3) X를 읽어오는 트랜잭션1이 수행 되었으나 내용이 변경됨

 

3. 유령데이터 읽기(Phantom Read)

- 조회가 두번 동작하는 중간에 insert가 동작하여 두번째 조회에서 갑자기 없던 데이터가 생기는 문제

(Example)

1) X,Y를 조회하는 트랜잭션1 수행중 1번 읽었을때 트랜잭션 동작 변경

2) Insert Z를 수행하는 트랜잭션 2 수행

3) 조회 트랜잭션1이 수행 되었으나 기존에 없던 Z가 수행됨

 

[2] 두개의 트랜잭션 모두 쓰는 상황에서 발생하는 문제

 

1. 갱신 손실 (Lost Update)

- 하나의 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어씀으로써 변경이 무효화되는 문제

- 두 트랜잭션이 같은 데이터를 update하는 과정에서 발생

(Example)

1) 트랜잭션1이 X = 10일때 X+=5를 수행해서 X=15로 만듦

2) 동시에 트랜잭션2가 X-=5를 수행해서 X=5로 만듦

3) 트랜잭션 1이 수행 결과인 X=15가 무시됨

 

2. 모순성

- 트랜잭션 도중에 데이터가 다른 트랜잭션에 의해서 변경되어서 중간에 다른 데이터를 변경하게 되는 문제

(Example)

1) 트랜잭션1이 X=10 ,Y=10 에 5씩 각각 더하는 도중 X=15 만 수행함

2) 트랜잭션2가 동작하여 X,Y를 각각 3배로 곱해서 X=45 ,Y=30으로 만듦

3) 트랜잭션1의 Y부분이 동작하여 X=45 , Y=35가 수행됨

 

3. 연쇄 복귀

- 트랜잭션 내용에 대해서 롤백해야 하는 상황에서 다른 트랜잭션이 동시에 동작하여 롤백할 수 없는 상황

(Example)

1) X=10 , Y = 10에서 트랜잭션 1이 X,Y에 5씩 더하는 연산을 수행함

2) X=15를 만들고 X를 3배로 만드는 트랜잭션 2가 동작함

3) X=45가 되고 Y를 변경하는 트랜잭션중 오류가 발생하여 롤백하여야함

4) X=15가 아닌 45가 되어 있으므로 롤백이 불가능함