상세 컨텐츠

본문 제목

데이터베이스 병행제어 기법 및 필요성

정보관리기술사

by somiyuralove 2023. 8. 24. 16:20

본문

데이터베이스 병행제어 기법은 여러 사용자가 동시에 데이터베이스에 접근하고 데이터를 수정할 때 데이터 일관성을 유지하기 위한 방법을 말합니다. 데이터베이스에서 동시에 여러 트랜잭션이 실행될 때, 이 트랜잭션들이 데이터에 접근하고 변경할 때 발생할 수 있는 문제들을 해결하기 위해 필요한 기법들이 포함됩니다.

병행제어의 필요성은 다음과 같은 이유로 인해 나타납니다:

  1. 동시성 제어: 여러 사용자가 동시에 데이터베이스에 접근하고 수정할 수 있기 때문에 각각의 트랜잭션들이 원활하게 실행될 수 있도록 보장해야 합니다. 병행제어는 트랜잭션들 간의 충돌을 방지하고 조율하여 데이터의 일관성을 유지합니다.
  2. 데이터 일관성: 동시에 실행되는 트랜잭션들이 데이터를 읽거나 수정할 때 일관성을 유지해야 합니다. 예를 들어, 한 트랜잭션이 데이터를 수정하는 동안 다른 트랜잭션이 이를 읽으면 수정 중인 데이터와 일관성이 없을 수 있습니다. 이를 방지하기 위해 병행제어 기법이 필요합니다.
  3. 데드락 방지: 병행 처리 중에 트랜잭션들 사이에 교착상태(데드락)가 발생하지 않도록 해야 합니다. 데드락은 각 트랜잭션이 다른 트랜잭션에서 필요로 하는 자원을 기다리며 무한히 대기하는 상황을 의미합니다.
  4. 효율성: 병행제어는 동시에 많은 트랜잭션이 실행될 때도 효율적인 데이터베이스 처리를 보장해야 합니다. 이를 위해 경쟁 상황에서도 최대한 많은 트랜잭션을 병행 실행할 수 있는 방법을 제공합니다.

일반적으로 데이터베이스 병행제어 기법은 여러 방법으로 구현될 수 있습니다. 대표적인 병행제어 기법으로는 2단계 잠금 프로토콜, 시리얼 가능성(Serializability) 검증, 타임스탬프(Timestamp) 순서 등이 있습니다. 이러한 기법들은 데이터베이스 시스템이 트랜잭션들을 효율적으로 관리하고 데이터의 일관성을 유지하는 데 도움을 줍니다.

병행 제어

DBMS는 여러 사용자가 동시에 데이터베이스를 이용할 수 있도록 병행 수행 기능을 제공한다. 병행 수행은 실제로 여러 트랜잭션이 차례로 번갈아 수행되는 인터리빙(interleaving) 방식으로 지원한다. 하지만 아무런 제어 없이 병행 수행을 할 경우 갱신 분실, 모순성, 연쇄 복귀 등의 문제가 발생할 수 있다. 때문에 트랜잭션을 병행 수행 하면서도 정확한 수행 결과를 얻을 수 있도록 트랜잭션의 병행 수행을 제어하는 병행 제어(동시성 제어)가 필요하다.

병행 제어 기법

병행 제어의 핵심 목표는 트랜잭션을 번갈아 가면서 수행하면서도 트랜잭션을 순차적으로 실행하는 것과 같은 결과를 내는 것이다. 트랜잭션을 순차적으로 실행한 결과는 항상 정확하고 일관되기 때문이다. 가장 많이 사용하는 병행 제어 기법으로 로킹 기법을 많이 사용한다.

 

로킹(locking) 기법은 병행 수행 되는 트랜잭션들이 동일한 데이터에 동시 접근되지 못하도록 lock과 unlock이라는 2개의 연산을 이용해 제어하는 기법이다. lock을 통해 데이터의 독점권을 가져오고 unlock를 통해 독점권을 반납한다. 한 트랜잭션이 데이터를 독점적으로 사용함으로써 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 상호 배제(mutual exclusion)한다. 이러한 방식은 OS에서 공유 자원에 대한 스레드 동기화에 사용되는 뮤텍스와 세마포어의 방식과 매우 유사하다.

로킹 규약

로킹 기법을 사용하려면 모든 트랜잭션이 로킹 규약을 지켜야한다. 로킹 규약이란 트랜잭션이 데이터에 접근하기 전에 먼저 해당 데이터에 lock 연산을 실행해 독점권을 얻어야 한다는 규약이다. 데이터베이스에서 데이터에 접근하기 위한 연산은 read와 write이므로 이들 연산을 실행하기 전에 반드시 lock 연산을 실행해야 한다. lock 연산을 실행한 트랜잭션 만이 unlock 연산을 실행해 독점권을 반납할 수 있다. 데이터에 write 연산을 수행하기 전에는 반드시 한 트랜잭션만이 해당 데이터에 독점권을 가져야한다. 하지만 read 연산은 그렇지 않다. 여러 트랜잭션이 동시에 같은 데이터에 read 연산을 수행해도 문제가 발생하지 않는다. 데이터베이스는 write 연산에 비해 read 연산의 비중이 대략 90%를 차지한다. 따라서 여러 트랜잭션이 동시에 수행해도 상관없는 read 연산을 한 트랜잭션만이 독점권을 얻어 실행한다면 병행성과 처리 성능이 매우 떨어진다. 그래서 lock 연산을 아래와 같이 두 종류로 구분한다.

 

공용(shared) lock

  • 트랜잭션이 A 데이터에 공용 lock 연산을 실행하면, 해당 데이터에 read 연산을 실행할 수 있지만 write 연산은 실행할 수 없다.
  • A 데이터에 공용 lock을 걸어도 다른 트랜잭션은 A 데이터에 공용 lock 연산을 실행할 수 있다.
  • A 데이터에 공용 lock이 하나라도 걸려있다면 전용 lock 연산을 실행할 수 없다.

전용(exclusive) lock

  • 트랜잭션이 A 데이터에 전용 lock 연산을 실행하면 A 데이터에 read 연산과 write 연산을 모두 실행할 수 있다.
  • A 데이터에 전용 lock을 걸면 다른 트랜잭션은 A 데이터에 공용, 전용 lock 연산을 실행할 수 없다.

read 연산 실행 전에는 공용 lock을 write 연산 실행 전에는 전용 lock을 실행하면 병행성과 처리 성능을 올릴 수 있다. 하지만 로킹 규약만으로 병행 수행의 문제점을 온전히 해결할 수 없다. 따라서 2단계 로킹 규약(2 phase locking protocol)이 등장하게 되었다.

2단계 로킹 규약

모든 트랜잭션이 2단계 로킹 규약을 준수하면 트랜잭션을 병행 수행해도 트랜잭션을 순차적으로 수행한 것과 같은 결과를 낼 수 있다. 2단계 로킹 규약은 기본 로킹 규약에 더불어 lock과 unlock 연산을 2단계로 나누어 실행하는 규약이다.

  • 확장 단계 : 트랜잭션이 lock 연산만 실행할 수 있고 unlock 연산은 실행할 수 없는 단계
  • 축소 단계 : 트랜잭션이 unlock 연산만 실행할 수 있고 lock 연산은 실행할 수 없는 단계

트랜잭션이 처음에 실행하면 확장 단계로 들어가 lock 연산만 실행할 수 있다. 그러다가 unlock 연산을 수행하면 축소 단계로 들어가 그때부터는 unlock 연산만 실행할 수 있게 된다. 따라서 unlock 연산을 수행하기 전에 필요한 모든 lock 연산을 실행해야 한다.

교착 상태

2단계 로킹 규약을 적용하면 트랜잭션을 병행 수행해도 트랜잭션을 순차적으로 수행한 것과 같은 결과를 낼 수 있지만 교착 상태가 발생할 수 있다. 교착 상태란 상대가 독점하고 있는 데이터에 unlock 연산이 실행되기를 서로 기다리면서 트랜잭션의 수행이 중단된 상태이다. 교착 상태에 빠진 트랜잭션들은 수행되지 못하고 상대방이 unlock 연산을 실행해주기를 한없이 기다리게 된다. 교착 상태는 처음부터 발생하지 않도록 예방하거나, 발생했을 때 빨리 탐지하여 필요한 조치를 취하는 방법으로 해결한다.

로킹 단위

lock 연산을 실행하는 대상 데이터의 크기인 로킹 단위도 생각해야한다. lock 연산은 크게 전체 데이터베이스부터 작게는 속성에 이르기까지 다양한 크기의 데이터를 대상으로 실행할 수 있다. 이때 로킹 단위가 클수록 병행 제어가 쉽지만 병행성은 낮아지고 로킹 단위가 작을수록 병행 제어는 어렵지만 병행성은 높아진다. 그러므로 시스템에 따라 적절한 로킹 단위를 선택하는 것이 중요하다.

'정보관리기술사' 카테고리의 다른 글

데이터 거버넌스  (0) 2023.08.25
요구사항명세서에 기술되어야 하는 항목  (0) 2023.08.24
노코드(no-code) 란  (0) 2023.08.24

관련글 더보기

댓글 영역