😺Data Base/😻 SQLD

[DB] Transaction - 동시성 문제

디카페인라떼 2022. 9. 20. 00:52

2022.09.10 - [DB] - [DB] 트랜잭션 Transaction 이란?

 

[DB] 트랜잭션 Transaction 이란?

트랜잭션 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들 => 데이터베이스의 상태를 변화시킨다는 것?

wearegolden.tistory.com

2022.09.19 - [DB] - [DB] Transaction - Atomicity 원자성 이해하기

 

[DB] Transaction - Atomicity 원자성 이해하기

2022.09.10 - [DB] - [DB] 트랜잭션 Transaction 이란? 데이터베이스의 상태를 변화시킨다는 것? " data-og-host="wearegolden.tistory.com" data-og-source-url="https://wearegolden.tistory.com/175" data-og-u..

wearegolden.tistory.com

참고한 강의

https://youtu.be/poyjLx-LOEU


경쟁상태 (Race Condition)

  • 같은 데이터에 동시 접근 시 생기는 문제
  • 여러 클라이언트가 같은 데이터에 접근할 때 문제 발생
  • 해결방법
    • 트랜잭션 격리 (isolation)
    • 트랜잭션을 서로 격리해서 다른 트랜잭션이 영향을 주지 못하게 함
    • 가장 쉬운 방법은 트랜잭션을 순서대로 실행
    • 동시 접근 문제 아예 없음
    • 하지만 한 번에 한개 트랜잭션만 처리하므로 성능 (처리량) 저하 가능
    • 다양한 격리 수준 지원
      • Read Uncommitted :사실상 사용하지 않음
      • Read Committed
      • Repeatable Read
      • Serializable

 

동시성 관련 다양한 문제들

1. 커밋되지 않은 데이터 읽기 = dirty read

  • 3번에서 cnt = 2여야하나 커밋이 되지않아 다른 데이터가 나감

 

2. 커밋되지 않은 데이터 덮어쓰기 = dirty write

  • 커밋되지않은 데이터가 덮어써짐

 

 

🚨Read Committed 격리 레벨

  • 커밋된 데이터만 읽기
    • 커밋된 값과 트랜잭션 진행 중인 값을 따로 보관
  • 커밋된 데이터만 덮어쓰기
    • 행 단위 잠금 사용 (Lock)
    • 같은 데이터를 수정한 트랜잭션이 끝날 때까지 대기

 

3. 읽는 동안 데이터 변경 1 = read skew

  • 1번의 값 A를 읽었으면 5번 값 B일때도 처음 데이터를 읽어야 하나 그사이에 데이터가 변경되어 다른 값이 나옴.

 

 

 

🚨Repeatable Read

  • 트랜잭션 동안 같은 데이터를 읽게 함
  • 읽는 시점의 version을 같게 함.
  • db에는 두가지 version을 저장함 (읽을때 해당하는 버전의 값을 읽음)

 

 

4. 변경유실 = Lost Update

 

  • 잠금을 사용하였으나 기댓값과 다른 값이 나옴. (변경되는 과정에서 유실됨)

 

🚨처리방법

  • 원자적 연산 사용
    • DB가 지원하는 원자적 연산 사용
    • 동시 수정 요청에 대해 DB가 순차 처리
    • 예 : update article set readcnt = readcnt+1 where id = 1

 

  • 명시적인 잠금

👉조회할 때 수정할 행을 미리 잠금

 

 

  • CAS (Compare And Set)

👉수정할 때 값이 같은지 비교

 

 

5. 읽는 동안 데이터 변경2

  •  두 트랜잭션이 서로 다른 데이터를 업데이트 했기때문에 생기는 문제

 

 

🚨Serializable 격리

  • 인덱스 잠금이나 조건 기반 잠금 등 사용
  • 3번이 먼저 인덱스 잠금을 하여 중간에 업데이트를 못하게 함.

 


[정리]

🚩 동시성은 초보자가 놓치기 쉬운 문제
   👉 동시성 문제와 격리 수준을 이해하면 문제 발생을 줄일 수 있음
🚩 잠금 시간은 최소화
   👉 잠금 시간이 길어지면 성능 (처리량) 저하
🚩 동시성 문제를 다룰때는 다음을 알면 좋음
   👉 사용하는 db의 기본 격리 레벨
   👉 DB의 격리 레벨 동작 방식 (DB마다 동작 방식이 다를 수 있음)

'😺Data Base > 😻 SQLD' 카테고리의 다른 글

[SQL] SQL 종류 - DDL / Data Type  (0) 2022.10.31
[SQL] JOIN  (0) 2022.09.20
[DB] Transaction - Atomicity 원자성 이해하기  (0) 2022.09.19
[DB] Index  (0) 2022.09.17
[RDBMS] 관계형 데이터 모델링 2  (0) 2022.09.16