Published 2025. 11. 12. 23:14
동시성제어(concurencyControl)란,
동시에 실행되는 트랜잭션 수를 최대화 하면서도 입력, 수정, 삭제,
검색시 데이터의 무결성이 유지 될 수있도록 노력하는것을 말한다.

 

 

여러개 트랜잭션 이동시에 수행될때, 데이터베이스 애플리케이션은 이들 트랜잭션이 서로 간섭을 일으키는 현상을 최소화하면서 데이터의 일관성과 무결성이 보장되도록 개발되어야 하는것이다.

 

 

동시성(Concurrency) : 다중 사용자가 같은 데 이터를 동시에 액세스

일관성(Consistency) : 자신이 발생시킨 변경 사항과 다른 트랜잭션의 변경사항( 읽을수 있는 버전만 허용)을 포함해 일관성 있는 상태로 데이터를 제공

 

동시성 제어가 어려운 이유

동시성 과 일관성이 트레이드 오프 관계에 있다는 데에 있다. 즉, 동시성을 높이려고 Lock의 사용을 최소화 하면 읽기 일관성을 유지하기 어렵고, 데이터의 일관성을 높이려고 Lock을 많이 사용하면 동시성이 떨어지게 된다. 따라서 동시성과 일관성이라는 두 마리 토끼를 한꺼번에 잡으려면 매우 세심한 주의가 필요하다.

 

동시성 제어 구현 전에 독자의 이해를 더 돕기 위해 트랜잭션의 기본 개념부터 살펴보도록하자.

 

트랜잭션이란?

 

 - 일관성 있게 데이터가 처리되려면 두 개 이상의 갱신연산이 동시에 실행될 수 있어야 하는데, 불행히도 이는 불가능한 일이다.

따라서 트랜잭션 관리능력을 갖춘 DB는 차선책을 사용해서 동시 실행을 구현한다. 즉, 여러 개의 수정 작업이 하나의 작업처럼 전부 처리되거나 아예 전부 처리가 안 되도록(All or Nothing) 하는 것인데, 이러한 일의 최소 단위를 트랜잭션이라고 한다. (원자성)

예시) 

은행 업무의 "계좌이체" 트랜잭션은 하나의 예금 계좌에서 인출하여 다른 예금 계좌에 입금하는데, 이 두 작업은 하나의 단위로 함께 수행되어야한다.

 

 - 트랜잭션은 업무 처리의 기본 단위를 정의하는 것이므로 실제 애플리케이션 설계단계에서는 업무적인 관점에서 좀 더 포괄적으로 정의하게 된다. 예컨대, "계좌이체" 라는 트랜잭션을 정의할 때 최초에 현금잔고를 확인하고 이체빔리번호와 보안카드 코드값을 입력받아 최종 이체가 완료되는 순간까지를 포함해서 넓게 정의할 수도 있다.
동시에 다른 두 사람이 현금을 인출 하는 상황을 가정해보자.

 

 하나의 레코드를 읽고 트랜잭션이 계속 진행되는 동안 다른 트랜잭션에 의해 앞서 읽은 데이터가 다른 값으로 변경되는 Non-repeatable Read 현상이 발생했던 사례로 볼 수 있다. 이런 현상 때문에 고객이 당황하는 일을 미연에 방지하려면 현금잔고 조회부터 하나의 트랜잭션으로 묶어서 정의하고 그에 따라 출력 메시지도 바꿔야 한다고 생각이 든다. 

값이 잘못 갱신되지는 않았지만 데이터 조작 측면에서의 트랜잭션은 완벽했다고 볼 수 있지만, 업무적인 관점에서의 좀 더 세밀한 트랜잭션 제어가 필요하다는 뜻이다.

 

혹은 온라인 주문 트랜잭션은 어떨까? 

 

상품정보를 확인하고 각종 주문정보를 입력하고 나서 최종 결제를 완료하는 순간까지를 하나의 트랜잭션으로 정의하는 것이 타당하다. 

결제는 완료 되었는데 적립금 누적 처리가 누락되거나 배송지 입력이 실패하는 일이 발생해서는 안되며, 모든 처리가 성공 또는 실패로 매듭지어져야 한다. 뿐만 아니라 적어도 수분 이상 소요되는 주문처리가 진행되는 동안 다른 트랜잭션에 의해 상품가격이 바뀌거나 재고량이 변경될 때는 어떻게 처리할지에 대한 세심한 고려가 있어야한다. 

프로세스 설계 및 구현 과정에서 이를 간과함으로 인해 일 마감 또는 월 마감 시점마다 데이터를 일일이 수작업으로 보정해야 하는 수고스러운 상황도 겪을 수 있다.

 

 


트랜잭션의 특징(ACID) 
 - 데이터베이스 갱신과 관련 하여 트랜잭션은 4가지 중요한 특징을 갖는다. 

원자성(Atomicity) : 앞서 트랜잭션의 정의 부분에서 이미 설명한 바와 같고 더 이상 분해가 불가능한 업무의 최소단위를 말한다.

일관성(Consistency) : 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다. 즉 트랜잭션 실행의 결과로 데이터베이스 상태가 모순되지 않는다. 

격리성(Isolation) : 트랜잭션이 실행 중에 생성하는 연산의 중간 결과는 다른 트랜잭션이 접근할 수 없다. 

영속성(Durability) : 트랜잭션이 일단 그 실행을 성공적으로 완료하면 그 결과는 데이터베이스에 영속적으로 저장된다.

 

 

Oracle 과 같은 고가의 DBMS를 사용하는 이유로는 성능, 관리의 편의성 등 여러 가지 측면이 있지만, 무엇보다도 트랜잭션 처리 능력이 가장 기본적이고 핵심적인 요소라 할 수 있다. 

트랜잭션의 처리결과가 데이터의 일관성을 해치지 않도록 하려면 트랜잭션의 순차적 진행을 보장할 수 있는 직렬화 장치가 필요하다. 

이를 위해 DBMS가 공통적으로 사용하는 메커니즘이 Lock이다. 

그뿐만 아니라 오라클은 더 높은 수준의 읽기 일관성을 보장하기 위해 Undo 데이터를 활용한 독특한 읽기 일관성 모델을 사용하고 있다.

 

 

다음에는  트랜잭션 수준 읽기 일관성에 대해서 알아보도록 하겠습니다.

'DB' 카테고리의 다른 글

Database Lock 이란?  (1) 2024.06.18
N+1 문제 해결: Java 백엔드 개발자를 위한 데이터베이스 쿼리 최적화  (1) 2024.06.05
PL/SQL 이란  (1) 2022.01.10
데이터베이스 모델링 -1  (0) 2022.01.07
SQL 사용자 권한  (0) 2022.01.05
복사했습니다!