본문 바로가기

내가 마주치는 Error들

[DB ORACLE] 동시성 문제

예전에, DB 동시성과 관련된 이슈사항들이 발생하였고 해결했던 경험과 방법들을 공유해보자 한다.

동시성 문제란 무엇인가에 대해 파악하였고, 여러 해결방법들에 대해서 적을것이고, 나의 사례는 어떻게 해결했는지에 대해서 말할것이다.

동시성 문제란?

  • 사전적 의미는 하나의 CPU 코어에서 시간분할(Time sharing)을 통하여 여러 일을 처리하는 것 처럼 보여지게 하는 기법을 의미합니다.
  • 대중적으로는, 여러 요청이 동시에 동일한 자원(data)에 접근하고 수정하려는 것을 의미합니다.
  • 이와 같은 현상은 DB에서 더욱 자주 발생합니다.데이터를 수정하여 저장했지만 다시 조회했을 때 다른 값이 반환되는 경우입니다. 이때 데이터의 무결성이 깨지고, 의도하지 않은 결과가 반환됩니다.

문제 해결 방법

비관적인 방법

  • 데이터에 Lock을 거는 방식으로, 데이터의 무결성을 완벽히 지킬 수 있습니다.
  • 단점은 lock으로 인하여 이후의 다른 요청은 대기상태로 빠집니다.
  • 두 번째는 select for update 활용하여 명시적으로 lock을 잡을 수 있습니다.
  •  하지만 lock을 잡는 구간이 길어져 성능에 심각한 영향을 끼칩니다. 극장예매와 같은 서비스가 아니라면 사용하지 않는것이 좋습니다.
  • 마지막은 Data의 transaction의 write lock을 활용하는 것입니다. 일반적으로 데이터를 수정할 때 write lock이 걸리고 transaction이 끝나야 lock이 풀리는 것을 이용합니다. 데이터의 일관성을 유지할 수 있지만 DB와 서버 성능에 따라서 서비스 속도가 좌우됩니다.

낙관적인 방법

  • 수정하려는 데이터는 나만 수정할 것이라는 낙관적인 생각의 방법입니다. 테이블에 version이라는 숫자컬럼 또는 updated_at 이라는 시간컬럼을 만들어서 수정될 때마다 1씩 증가하거나, 현재시간으로 갱신하게 해줍니다.
  • 값을 수정할 때 Version이 동일하면 수정이 가능해지고, 동일하지 않으면 수정에 실패합니다.

사례

환경

  • Back end Framework : Spring boot 2.x대, Mybatis
  • DB : RDB
  • Spring Framework의 경우, Multi Thread 환경으로 동작한다
  • 또한 현재 서버까지 이중화를 하였으므로 다중 인스턴스 환경으로 동작한다.

원인

  • 테이블에서 MAX값을 채굴해서 데이터를 Insert하는 로직이 존재하였다.
  • 하지만, 동시에 DB에 접근하는 경우,  같은 값의 MAX값을 채굴하는 경우가 생겨서 데이터를 Insert할시 Primary Exception 오류가 발생하였다.

해결방법

1) 해당 트랜잭션 안에서 Max값을 채굴하는 경우가 존재한다면, Lock을 걸어서 이후 Session은 대기하도록 처리하는 방법

2) 동시성 보호를 받기 위해, MAX값을 채굴하지 않고 DB단에서 Sequence를 생성해 해당 Sequence를 이용해 Insert하는 방법

3) 구조를 처음부터 아예 바꾸는 방법

선택

2번째 경우를 선택했다. 그 이유는

 

  • 해당 서비스는 코로나 문진표 검사라는 서비스 였고, 해당 서비스는 체크인을 진행하기 전에 온라인으로 작성하는 방식이였다. 만약 Max값을 채굴하는 Select에 Lock을 거는 경우 For Update 문을 걸어야 하는데 그럴 경우 성능이 떨어질 우려가 존재하였다.
  • 하지만, DB Sequence를 이용하는 경우 자체적으로 동시성 제어를 위한 최적화를 진행하였고 어플리케이션에서 해당 서비스를 수정하기 위해 발생시키는 비용이 적었다.
  • 그렇기에 Sequence를 생성하여 .Sequence에서 값을 채굴하는 방식으로 해당 동시성 문제를 해결하였다.

Sequence에 대해 알수 있는 페이지를 첨부하는 것으로 마무리 하려고 한다.

http://www.gurubee.net/lecture/1037

 

시퀀스(Sequence)의 이해 및 활용

시퀀스란? - 유일(UNIQUE)한 값을 생성해주는 오라클 객체이다. - 시퀀스를 생성하면 기본키와 같이 순차적으로 증가하는 컬럼을 자동적으로..

www.gurubee.net

 

'내가 마주치는 Error들' 카테고리의 다른 글

크롬80,84 쿠키정책 변경 이슈  (0) 2022.08.02
취지  (0) 2022.07.26