공부/데이터베이스

[데이터베이스] 트랜잭션(transaction), locking

ghhong 2021. 10. 21. 14:27

1.    Transaction

트랜잭션이란?

DB의 상태를 변화시키기 위해 수행하는 작업의 단위

 

트랜잭션의 특징(acid)

ㅇ 원자성(atomicity) : 트랜잭션이 데이터베이스에 모두 반영되던가 전혀 반영되지 않아야 한다.

ㅇ 일관성(consistency) : 트랜잭션의 작업 처리 결과가 일관적이어야 한다.

ㅇ 독립성(isolation) : 둘 이상의 트랜잭션이 실행되고 있을 경우 어떤 하나의 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들 수 없다.

ㅇ 지속성(durability) : 트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 한다.

 

Commit, Rollback, Savepoint

commit이란 하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성있는 상태에 있을 때 하나의 트랜잭션이 끝났다는 것을 알려주기 위해 사용하는 연산이다. 이 연산을 사용하면 수행했던 트랜잭션이 로그에 저장된다.

한 세션에서 커밋 이전의 상태면 Lock이 걸려있으므로 다른 세션에서의 작업은 커밋 또는 롤백이 완료될 때까지 기다린다.

    동시성 제어 기법 잠금(locking) 기법

동시성 제어(concurrency control)?

다중 사용자 환경을 지원하는 데이터베이스 시스템에서 동시에 실행되는 여러 트랜잭션간의 간섭으로 인한 문제가 발생하지 않도록 트랜잭션의 실행 순서를 제어하는 기법

ㅇ 동시에 실행되는 트랜잭션들이 서로 간에 간섭함으로써 발생하는 문제들

1.     갱신 분실(lost update) : 트랜잭션들이 동일한 데이터를 동시에 갱신하는 경우에 발생. 또는 이전 트랜잭션이 데이터를 갱신한 후 트랜잭션이 종료하기 전에 나중 트랜잭션이 동일한 데이터를 갱신하여 갱신 값을 덮어쓰는 경우에 발생하는 문제

2.    연쇄 복귀(cascading rollback) or 회복 불가능(unrecoverability) : 여러 개의 트랜잭션이 데이터를 공유할 때, 특정 트랜잭션이 이전 상태로 복귀(rollback)할 경우 아무 문제 없는 다른 트랜잭션까지 연달아 롤백되는 문제.

3.    불일치 분석(inconsistent analysis) : 여러 개의 트랜잭션이 동시에 실행할 때 끼어들기로 인해 트랜잭션의 일관성이 유지되지 못하는 현상

ð 따라서 동시성 제어가 필요하다

ð locking(병행수행을 보장하면서 직렬스케줄과 동일한 결과를 내야한다.)

ð 트랜잭션의 실행순서를 강제로 제어

Locking : 하나의 트랜잭션이 실행되는 동안 특정 데이터 항목에 대해 다른 트랜잭션이 동시에 접근하지 못하도록 상호배제(mutual exclusive)기능을 제공하는 기법이다. 하나의 트랜잭션이 데이터 항목에 대해 lock을 설정하면, unlock할 때까지 데이터를 독점적으로 사용한다.

공유잠금(shared lock) : 공유잠금을 설정한 트랜잭션은 데이터 항목에 대해 읽기연산만 가능하다. 하나의 데이터 항목에 대해 여러 개의 트랜잭션이 공유잠금 가능하다.

배타잠금(exclusive lock) : 배타잠금을 설정한 트랜잭션은 데이터 항목에 대해서 읽기연산과 쓰기연산 모두 가능하다. 하나의 데이터 항목에 대해서는 하나의 배타잠금만 가능하다.

잠금 단위 : 필드값 , 레코드, 디스크 블록, 테이블, 데이터베이스까지 잠금 단위가 될 수 있다. 잠금 단위가 클수록 동시성(병행성) 수준은 낮아지고, 동시성 제어 기법은 간단해지고, locking오버헤드는 감소한다. 잠금 단위가 작을수록 반대이다.

잠금의 한계 :

ㅇ 교착상태(deadlock)이 발생할 수 있다.

ㅇ 직렬 가능한 스케줄이 항상 보장되지 않는다 -> 2단계 잠금 규약(2PL)로 해결

-- 2단계 잠금 규약(2-Phase Locking protocol: 2PL) : 두 단계로 실행

-     확장 단계(growing phase) : 트랜잭션이 lock연산만 수행할 수 있다.

-     축소 단계(shrinking phase) : 트랜잭션이 unlock연산만 수행할 수 있다.

-- 엄격한 2단계 잠금 규약(strict 2PL) : 모든 x-lock(배타잠금)에 대한 unlock연산을 트랜잭션이 완전히 완료한 후에 실행한다.

 

rollback이란 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨질 경우, 트랜잭션을 처음부터 다시 시작하거나 트랜잭션의 부분적으로 연산된 결과를 취소시킨다.

 

savepoint란 하위 트랜잭션을 실현하기 위한 데이터베이스 언어 sql중 하나로, 트랜잭션의 특정 지점에 이름을 지정하고 그 지점 이전에 수행한 작업에 영향을 주지 않고 그 지점 이후에 수행한 작업을 롤백할 수 있다.

Savepoint는 데이터베이스를 이용하는 응용프로그램에서 복잡한 오류 복구 처리를 실현하는데 효과적이다. 여러 문이 갖춰진 트랜잭션 도중에 에러가 발생했을 경우, savepoint를 사용하면 전체 트랜잭션을 롤백하지 않고 오류에서 복귀할 수 있다.

 

--사용예

BEGIN;

  INSERT INTO tbl VALUES (1);

SAVEPOINT savepoint_example;

  INSERT INTO tbl VALUES (2);

ROLLBACK TO SAVEPOINT savepoint_example;

  INSERT INTO tbl VALUES (3);

COMMIT;

-- 1 3이 삽입된 형태가 된다.

'공부 > 데이터베이스' 카테고리의 다른 글

[데이터베이스] key  (0) 2021.10.21
[데이터베이스] 조인(join)  (0) 2021.10.21
[데이터베이스] 정규화  (0) 2021.10.21
[데이터베이스] 트리거(trigger)  (0) 2021.10.21
[데이터베이스] ORACLE vs MySQL  (0) 2021.10.21