TIL | [Transaction] 동시성 처리

bubblegum·2024년 3월 13일
0

Today I learn(TIL)

목록 보기
31/84
post-thumbnail

Race Condition

경합 조건(Race condition)은 병렬 처리 환경에서 둘 이상의 프로세스나 스레드가 공유 데이터를 동시에 접근할 때 발생하는 문제입니다. 이러한 상황에서는 각 프로세스나 스레드가 공유 데이터를 변경하려고 시도하며, 그 결과 데이터의 일관성이 깨지고 예상치 못한 동작이 발생할 수 있습니다.

1. Race condtion이 발생하는 상황

경합 조건은 일반적으로 다음과 같은 상황에서 발생할 수 있습니다:
1. 동시에 발생하는 여러 프로세스나 스레드가 공유 데이터에 동시에 접근할 때.
2. 공유 데이터에 대한 연산이 여러 단계로 나누어져 있을 때, 각 단계가 동시에 실행될 때.

2. Race condtion에 의한 문제 발생

경합 조건은 주로 다음과 같은 문제를 초래할 수 있습니다:

  1. 일관성이 깨질 수 있음: 여러 프로세스나 스레드가 동시에 공유 데이터를 변경하면서 데이터의 일관성이 깨질 수 있습니다. 이로 인해 잘못된 결과가 발생할 수 있습니다.
  2. 예상치 못한 동작이 발생할 수 있음: 경합 조건이 발생하면 예상치 못한 동작이 발생할 수 있습니다. 예를 들어, 공유 데이터의 값을 변경한 후 해당 값을 사용하는 연산이 동시에 실행되면, 변경된 값을 사용하지 못하거나 예상치 못한 결과가 발생할 수 있습니다.

3. Race condtion 방지

경합 조건을 방지하기 위해서는 동기화 메커니즘을 사용하여 공유 데이터에 대한 접근을 제어해야 합니다.

1. 데이터베이스의 락(Lock)

2. 세마포어(Semaphore)

세마포어(Semaphore)는 병렬 처리 환경에서 공유 자원에 대한 접근을 조절하기 위한 동기화 도구입니다. 세마포어는 정수값과 두 개의 기본 연산을 갖습니다: 증가(increase)와 감소(decrease)입니다. 세마포어는 주로 상호 배제(mutual exclusion)와 동기화(synchronization)를 위해 사용됩니다.

세마포어는 보통 "공유 자원에 대한 사용 가능한 자원의 수"를 나타내는 정수 변수로 구현됩니다. 세마포어 값은 양수일 수도 있고, 음수일 수도 있습니다. 이 값이 음수이면, 대기 중인 프로세스나 스레드가 있음을 나타냅니다.

세마포어의 주요 연산은 다음과 같습니다:

  • 증가(Increase) 또는 V(V) 연산: 세마포어 값을 증가시킵니다. 이 연산은 공유 자원을 사용한 후 해당 자원을 해제하는 작업을 완료한 후에 호출됩니다. 만약 대기 중인 프로세스나 스레드가 있다면, 이 연산을 호출하여 대기 중인 프로세스나 스레드 중 하나를 깨웁니다.

  • 감소(Decrease) 또는 P(P) 연산: 세마포어 값을 감소시킵니다. 이 연산은 공유 자원을 사용하기 위해 해당 자원에 접근하려는 프로세스나 스레드가 있을 때 호출됩니다. 만약 세마포어 값이 양수이면, 이 값을 감소시키고 해당 자원에 접근을 허용합니다. 그러나 만약 세마포어 값이 0 이하이면, 호출한 프로세스나 스레드는 대기 상태로 전환됩니다.

3. 트랜젝션(Transaction)

트랜잭션(Transaction)은 데이터베이스에서 여러 개의 작업을 논리적으로 묶어서 원자적(atomic)으로 실행하는 메커니즘입니다. 트랜잭션은 ACID(원자성, 일관성, 고립성, 지속성) 속성을 준수하여 데이터베이스의 일관성과 무결성을 보장합니다.

트랜잭션은 일반적으로 다음과 같은 상황에서 사용됩니다:

  1. 여러 개의 데이터베이스 작업이 순서대로 실행되어야 하며, 중간에 어떤 작업이 실패하면 이전 상태로 롤백되어야 하는 경우.
  2. 여러 개의 작업이 모두 성공적으로 실행되어야만 변경 사항이 영구적으로 저장되어야 하는 경우.

트랜잭션을 사용하면 여러 개의 데이터베이스 작업이 원자적으로 실행되므로, 경합 조건(Race condition)을 방지하고 데이터의 일관성을 보장할 수 있습니다. 따라서 트랜잭션을 사용하여 공유 자원에 대한 안전한 접근을 보장할 수 있습니다.

여러 사용자가 동시에 데이터베이스에 접근하고 변경할 때 발생할 수 있는 문제를 방지하기 위해 트랜잭션을 사용하는 것이 일반적인 방법 중 하나입니다. 트랜잭션을 사용하면 데이터베이스에 대한 변경이 원자적으로 처리되므로, 여러 사용자 간의 충돌이나 데이터 일관성 문제를 방지할 수 있습니다.

profile
황세민

0개의 댓글

관련 채용 정보