Computer Science/데이터베이스

데이터베이스 트랜잭션

콩순이냉장고 2021. 12. 18. 16:37

트랜잭션은 DBMS에서 데이터를 다루는 논리적인 작업 단위다.

보통 단일 SQL문을 사용하지만 여러개의 SQL문을 순차적으로 작성하기때문에 트랜잭셩을 정의하는 이유는 다음과 같다.

 

  • 데이터베이스에서 데이터를 다룰때 장애가 일어나는 경우, 트랜잭션은 장애 시 데이터를 복구하는 작업의 단위가 됨
  • 데이터베이스에서 여러 작업이 동시에 같은 데이터를 다룰때가 있다. 트랜잭션은 이 작업을 서로 분리하는 단위가 된다.

 

생각해보자

 

A계좌에서 B계좌로 만원을 이체할때 SQL을 실행한다고 보면

 

1
2
3
4
5
6
7
BEGIN
 
  1. A계좌에서 만원을 인출하는SQL UPDATE 문
 
  2. B계좌에서 만원을 입금하는 SQL UPDATE 문
 
END
cs

 

 

위의 예에서 만약 1번 SQL문이 수행된다음 시스템에 문제가 생기거나 다른 UPDATE문이 끼어들어 A계좌에서 돈을 동시에 인출하면, A계좌와 B계좌의 잔액이 의도하지 않는 값이 될수 잇다 따라서 1번 SQL문과 2번SQL문이 모두 수행되거나 혹은 아예 수행되선 안된다.

 

만약 1번 SQL문을 수행한 다음 문제가 생겨 2번 SQL문을 수행할 수 없다면 1번 SQL문은 취소해야한다

따라서 수행 단위라는 것을 알이기위해 

1
2
3
4
5
START TRANSACTION
    1. A계좌에서 1만원을 인출하는 SQL UPDATE 문
    2. B계좌에서 1만원을 입금하는 SQL UPDATE 문
COMMIT
 
cs

 

위와 같이 작성하면 1,2번 두 SQL문은 하나의 논리적인 작업의 단위가 된다.

 

 

트랜잭션 수행과정

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
START TRANSACTION
 
/*A 계좌인출*/
UPDATE Customer
SET balance = balance-10000
WHERE name = 'A계좌';
 
/*B 계좌입금*/
UPDATE Customer
SET balance = balance+10000
WHERE name = 'B계좌';
 
COMMIT /*부분완료 */
/*A계좌를 기록*/
/*B계좌를 */
cs

  1. A계좌의 값을 하드디스케에서 주기억장치 버퍼로 읽음
  2. B계좌의 값을 하드디스크에서 주기억장치 버퍼로 읽음
  3. A계좌에서 1만원 인출한 값 저장
  4. B계좌에서 1만원 인금한 값 저장
  5. A계좌의 값을 주기억장치 버퍼에서 하드디스크(데이터베이스)에 기록
  6. B계좌의 값을 주기억장치 버퍼에서 하드디스크(데이터베이스)에 기록

 

실제로 동작과정을 1~6까지 실행후 COMMIT을 실행할것같지만

DBMS는 1 - 2 - 3 - 4 의 과정을 수행후 COMMIT을 진행한다 5,6의 과정은 시간이 많이 소요되기 때문에

다른트랜잭션이 또 Customer 테이블을 필요로 할수 있기때문이다. 

따라서 각각의 트랜잭션이 하드디스크에 개별접근하는 것을 피하고 DBMS가 일괄적으로 하드디스크에 접근하여 처리함으로써 사용자에게 빠른 응답성을 보가하기 위해서다.

따라서  1 - 2 - 3 - 4 - COMMIT(부분완료) - 5 - 6 - 완료 

이렇게 진행된다

 

트랜잭션 수행 과정

 

트랜잭션 수행과정

 

 

 

트랙잭션과 프로그램 차이점

구분 트랜잭션 프로그램
프로그램 구조 START TRANSACTION
....
COMMIT
main(){
...
}
데이터 데이터베이스에 저장된 데이터 파일에 저장된 데이터
번역기 DBMS 컴파일러
성질 원자성,일관성,고립성,지속성 -

 

트랜잭션 4가지 성질

  • 원자성(Atomicity) : 트랜잭션에 포함된 작업은 전부 수행되거나 아니면 전부 수행되지 않아야 한다.(all or nothing)
  • 일관성(Consistency) : 트랜잭션을 수행하기 전이나 수행한 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다.
  • 고립성(Isolation) : 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경 중인 데이터 값을 훼손하는 일이 없어야 한다.
  • 지속성(Durability) : 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다. 저장된 데이터베이스는 저장 직후 혹은 어느 때나 발생할 수 있는 정전, 장애, 오류에 영향을 받지 않아야 한다

 

원자성

 

원자성을 유지하기위해 트랜잭션을 취소하는 명령어인 rollback을 사용하지만 트랜잭션의 길이가 길면 트랜잭션의 중간지점에 수정내용으 ㄹ반영하는 포인트를 만드는데 이를 savepoint라고 한다. 

savepoint를 이용하여 트랜잭션의 처음이 아니라 savepoint까지 돌아가면 트랜잭션의 전체가 rollback eㅚ는것을 막을수 있다

 

 

일관성

 

 

일관성은 테이블이 생성될때 CREATE 문과 ALTER문의 무결성 제약조건을 통해 명시

트랜잭션 수행중 일시적으로 일관성을 유지하지 못하는 상태가 있을수 있음 예를들어 

A계좌 +B계좌 = 20만원이 있다고 한다면 A계좌에서 1만원을 인출한후 B계좌에 입금한다고 보자

그렇다면 총액이 일시적으로 19만원으로 줄어드는 일관성없는 상태가 된다 그러나 트랜잭션이 종료된 후 다시 A계쫘 + B계좌 =20 만원이 된다

 

고립성

데이터베이스는 공유가 목적임 따라서 각트랜잭션은 독립적으로 작업을 수행하기 때문에 여러 트랜잭션이 동시에 수행될때 상호 간섭이나 데이터 충돌이 일어나지 않는 현상을 고립성이라고 함

고립성을 유지하기위해 변경중인 임시 데이터를 다른 트랜잭션이 읽거나 쓰려고 할때 제어하는 작업이 필요

 

시간 t1에서  트랜잭션 2와 트랜잭션3이 실행중이며 테이블 B를 동시에 다루고있음 이때 같은 데이터를 동시에 읽고 쓸 경우 변경중인 데이터를 다른 트랜잭션이 사용하면 데이터의 일관성이 회손될수 있기때문에 같은 데이터를 가지고 충돌하지 않도록 제어하는 작업이 필요 이작업을 동시성제어라고함

 

지속성

트랜잭션이 정상적으로 정상적으로 완료 혹은 부분완료한 데이터는 반드시 데이터 베이스에 기록되어햐함