본문 바로가기
기타

트랜잭션 문제 & 해결 + 용어

by 개발자종혁 2021. 11. 11.
728x90

경쟁 상태(RACE condition)를 해결하는 것이 트랜잭션 해결의 기본

1. 동시성 관련 문제  

1. 커밋 되지 않은 데이터 읽기 (dirty read)
2. 커밋 되지 않은 데이터 덮어 쓰기 (dirty write)
3. 읽는 동안 데이터 변경 (read skew
   - 읽는 시점에 따라 데이터가 바뀜

    예) select count를 두번 할때 그 사이 다른 곳에서 insert한것이 commit 되어 count가 바뀜
   - 이때 중간에 update, delete, insert등으로 바뀐 data를 read한 것을 phantom read라 함
4. 변경 유실 (load update) 
   - 같은 데이터를 업데이트 하려 할때 발생: 예) 컬럼의 값 1증가 시키기: 1에서 1증가 시키려고 컬럼 업데이트를 하려고 하기 전 다른 곳에서 1증가를 실행 하여 commit되었고, 해당 기대값은 3이 되어야 하나, 그대로 2가되어 해당 update가 적용되지 않음.
5. 읽는 동안 데이터 변경 2
   - 한 트랜잭션의 결과가 다른 트랜잭션의 쿼리 결과에 영향을 줄 때 - 같은 데이터를 쓰지 않지만 실제로는 경쟁 상태

 

 

2. 동시성 관련 문제 해결하기


1. Read committed

 - 커밋된 데이터만 읽고 , 덮어 쓴다
    - 구현: 커밋된 값과 트래잭션 진행 중인 값을 따로 보관
    - 행 단위로 잠금 사용 : 같은 데이터를 수정한 트랜잭션이 끝날 때까지 대기
 - dirty read, dirty write 해결

 

2. Repeatable Read - read skew 해결 하기


 - 트랜잭션 동안 같은 데이터를 읽게 함.
  - 구현: MVCC( Multi version concurrency control)
    읽는 시점에 특정 버전에 해당하는 데이터만 읽음
- read skew 해결

 

3. 변경 유실 처리 방법

- 원자적(atomic) 연산 사용
   - DB가 지원하는 원자적 연산 사용 : 동시 수정 요청에 대해 DB가 순차 처리
 - 조회할 때 수정할 행을 미리 잠금
   - 예) select .. for update
 - CAS (compare and set)
   - 수정할 때 값이 같은지 비교
   - 예) 단계 컬럼을 주어 해당 단계가 아니면 update를 하지 않음
 - 명시적인 잠금

 

4. serializable 격리


 - 인덱스 잠금이나 조건 기반 잠금 등 사용
 - 읽는 동안 데이터 변경 2 해결

 

 

참고 유튜브: 프로그래밍 초식 : DB 트랜잭션 조금 이해하기 02 격리 - YouTube

728x90

댓글