CS

동시성 제어(Concurrency Control)

킹갓홍 2024. 3. 26. 00:41

게시판을 만들다가 낙관적 락 이라는 단어를 주워 듣게 됐는데, 동시성 제어 기법 중 하나라는 것을 알게 되었다.

그래서 대충 알고 있었던 동시성 제어를 정리해봐야 겠다고 생각했다.

동시성 제어(Concurrency Control)란?

동시성 제어란 다수의 사용자로 인해 동시에 실행되는 여러개의 *트랜잭션 작업을 성공적으로 마칠 수 있도록 실행 순서를 제어하는 기법이다.

 

*트랜잭션

DBMS에서 데이터를 다루는 논리적인 작업의 단위로 DB에서 여러 작업이 동시에 같은 데이터를 다룰 때가 이 작업을 서로 분리하는 단위가 된다.

트랜잭션은 전체가 수행되거나 또는 전혀 수행되지 않아야 한다.(All or Nothing)

https://hsch19.tistory.com/13

 

@Transactional이란 무엇인가

개요 친구가 문제를 줬다. dao.saveMail(mailDto); 이후에 예외가 발생하면 어떻게 될까? - 첨부파일은 이미 저장되어 있는데 삭제되어야 할까? - DB에 보낸 메일정보를 저장은 삭제되어야 할까? 검색해

hsch19.tistory.com

 

동시성 제어의 목적

1. 공유도 최대, 응답시간 최소, 시스템 활동의 최대 보장

-> 여러 트랜잭션이 동시에 데이터에 접근 할 수 있도록 허용하여 시스템 자원을 최대한 공유하도록 한다 (트랜잭션이 무결성을 지키는 한해서)

-> 각 트랜잭션의 응답시간을 최소화하여 사용자 경험을 향상 시킨다.

-> 가능한 많은 트랜잭션이 동시에 실행될 수 있도록 허용하여 시스템 활동을 최대화  (트랜잭션이 무결성을 지키는 한해서)

2. 데이터의 무결성 및 일관성 보장

3. 트랜잭션의 직렬성 보장

즉, 트랜잭션 A와 트랜잭션 B가 읽는 작업에 대해서는 무결성이 침해되지 않으니 동시에 실행할 수 있도록 하지만, A가 수정중에 B가 읽는작업을 하려고 한다면 무결성이 침해가 되기 때문에 이를 지키기 위해서 동시성 제어가 필요하다.

 

동시성 제어를 하지 않는 경우 발생하는 문제

1. 갱신 손실(Lost Update)

A 트랜잭션이 갱신한 내용을 B트랜잭션이 덮어써서 갱신이 무효화되는 것을 의미

두 개 이상의 트랜잭션이 하나의 데이터를 동시에 갱신(Update)할 때 발생한다.

 

2. 현황파악 오류(Dirty Read)

A 트랜잭션이 수정 중에 B 트랜잭션이 읽기 작업을 해서 수정 중인 데이터를 읽게 되는 것을 의미

만약 A 트랜잭션이 롤백하는 경우, B 트랜잭션은 무효가 된 데이터를 읽어온 것이 된다.

 

3. 모순성(Inconsistency)

현황파악 오류와 마찬가지로 수정중인 데이터를 A와 B데이터가 읽어서 같은 데이터지만 A와 B의 데이터가 다른 경우를 의미

 

4.연쇄복귀 (Cascading Rollback)

한 트랜잭션이 데이터를 갱신한 다음 실패하여 Rollback 연산을 수행하는 과정에서 갱신과 Rollback 연산을 실행하고 있는 사이에 해당 데이터를 읽어서 사용할 때 발생할 수 있는 문제

 

동시성 제어의 종류

락킹(Locking)

트랜잭션이 테이터에 잠금(Lock)을 설정하면 다른 트랜잭션은 해당 데이터에 대해 잠금이 해제될 때 까지 접근/수정/삭제가 불가능하도록 한다.

 

- 공유 락(Shared Lock)

공유 잠금한 트랜잭션외 다른 트랜잭션들도 데이터 항목에 대해 읽기만 가능하도록 한다.

- 전용 락(Exclusive Lock)

전용 잠금한 트랜잭션외 다른 트랜잭션들은 데이터 항목에 접근을 불가능 하도록 한다.

A트랜잭션이 B데이터를 참고해서 A데이터를 수정할때, 다른 트랜잭션들이 B데이터를 수정하지 못하게 하기 위해서 B데이터에는 Shared Lock을 걸고 A데이터에는 Exclusive Lock을 거는 것을 생각하면 됨 

 

- 잠금 단위

잠금 단위가 클수록 동시성 수준은 낮아지고, 동시성 제어 기법은 간단해진다.

반대로 작을수록 동시성 수준은 높아지고, 관리가 복잡해진다.

- 블로킹 현상(Blocking)

Lock 간 경합이 발생하여 특정 Transaction 작업을 진행하지 못하고 멈춰선 상태를 말한다.

- 데드 락/교착 상태 (Dead Lock)

두 개 이상의 트랜잭션이 각각 자신의 데이터에 대하여 락을 획득하고 상대방 데이터에 대해 락을 요청하면 무한 대기 상태에 빠질 수 있는 현상이다.

단순 잠금 연산만 가지고 항상 직렬 가능한 스케줄을 보장하지 못하기 때문에 2단계 잠금 규약(2 Phase Locking)을 사용하여 해결할 수 있다.

 

- 2단계 잠금 규약(2 Phase Locking Protocol)

직렬 가능성을 보장할 수 있는 규약으로 모든 트랜잭션들이 lock과 unlock연산을  확장 단계와 축소단계로 구분하여 실행하는 것

확장 단계(Growing Phase) : 트랜잭션은 새로운 lock연산만 실행가능, unlock연산 실행 불가

축소 단계(Shrinking Phase) : 트랜잭션은 새로운 unlock연산만 실행가능, unlock연산 실행시 lock연산 더 이상 실행불가

 

타임 스탬프(Time Stamp)

시스템에에서 생성하는 고유 식별자인 타임스탬프를 트랜잭션에 부여해서 트랜잭션 간의 접근 순서를 미리 정한다.

 

적합성 검증/ 낙관적 검증 (Validation)

먼저 트랜잭션을 수행하고 종료할 때 적합성을 검증하여 데이터베이스에 최종 반영한다.

 


참고자료

https://velog.io/@choidongkuen/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4Concurrency-Controll

 

https://velog.io/@ha0kim/%EC%9E%A0%EA%B8%88Locking-%EA%B8%B0%EB%B2%95

 

https://mangkyu.tistory.com/30

 

https://velog.io/@ha0kim/%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%A0%9C%EC%96%B4