본문 바로가기
개발자 일지/기타

동시성 제어 개념, 방법, Lock 종류 및 비교

by 네빌링 2024. 9. 25.
반응형

 

동시성 제어 개념과 방법, Lock 종류 및 비교에 대한 포스팅을 해보려고 합니다.

트래픽이 많은 서비스들은 동시성에 대해 생각할 수 밖에 없는데요.

동시성 제어 개념, 제어 방법들과 그 중에서도 데이터베이스를 통한 동시성 제어인 Lock에 대해 알아보겠습니다.

 

 

[목차]

  1. 동시성 제어란
  2. 동시성 제어 방법
  3. 마치며

1. 동시성 제어란

 

동시성 제어(Concurrency Control)는 서비스 운영시 중요하게 고려해야할 부분입니다.

여러 쓰레드 또는 프로세스가 하나의 자원을 '동시에' 점유하려고 할 경우 동시성 문제가 발생합니다.

동시성 문제의 예는 여러가지가 있지만 고객들이 동시에 쿠폰 받기를 누를 경우에 발생할 수 있는데요.

여러 사람이 동시에 '쿠폰 받기'를 눌러서 A쿠폰을 동시에 select하려고 할 경우가 하나의 예죠.

 

이런 문제를 예방하기 위한 방법을 동시성 제어라고 합니다.

동시성 제어에는 여러가지 방법이 있습니다. 

 

크게 데이터베이스를 통한 동시성 제어 외에도 프로그램 레벨에서 동시성 제어를 구현하는 방법이 있습니다.

주로 멀티스레드 프로그래밍에서 동시성 문제를 해결하기 위해 다양한 기법들이 사용 됩니다.

 

이 포스팅은 데이터베이스를 통한 동시성 제어인 Lock 방식을 위주로 포스팅합니다.

 

2. 동시성 제어 방법

 

1) 낙관적인 락

 

낙관적인 락(Optimistic Lock)은 동시성에 대한 문제가 비교적 가볍거나 일어날 확률이 적은 경우에 쓸 수 있습니다.

 

아래는 예시입니다.

  • 트랜잭션 A와 B가 동일한 데이터를 조회하여 업데이트하려는 상황을 가정합니다. 테이블에는 버전 번호를 관리하는 컬럼이 있고, 현재 데이터의 버전은 1입니다.
  • 트랜잭션 A가 데이터를 조회하고, 버전 1을 가져온 상태에서 업데이트를 준비합니다. 동시에 트랜잭션 B도 데이터를 조회하고 버전 1을 가져옵니다.
  • 트랜잭션 A가 데이터를 수정하면서 버전을 2로 업데이트합니다.
  • 이제 트랜잭션 B가 데이터를 업데이트하려고 할 때, 트랜잭션 A가 이미 데이터를 수정하여 버전이 2로 변경된 것을 확인합니다. 이 경우, B는 자신이 가지고 있던 버전 1이 맞지 않음을 감지하고 업데이트를 중단하거나 재시도하게 됩니다.

 

낙관적 락은 주로 충돌이 빈번하지 않을 때 성능상 유리하며, 충돌이 발생하면 그때만 다시 처리하는 방식입니다.

 

2) 비관적인 락

 

비관적인 락(Pessimistic Lock)은 동시성 이슈 발생시 리스크가 크거나 발생확률이 높을 경우 사용하는 방법입니다.

SELECT FOR UPDATE 구문을 통해 사용할 수 있습니다.

 

아래는 예시입니다.

  • 트랜잭션 A, B가 동일 데이터에 접근하려는 상황을 가정합니다. 트랜잭션 A가 SELECT FOR UPDATE 구문을 사용해 데이터를 조회합니다.
  • 이 시점에서 데이터는 락이 걸립니다. 트랜잭션 B는 트랜잭션 A가 데이터를 업데이트하고 락을 해제할 때까지 기다려야 합니다.
  • 트랜잭션 A가 작업을 완료하고 커밋하면 락이 풀리고 이후 트랜잭션 B가 자원에 접근할 수 있습니다.

 

비관적 락은 동시성 이슈를 사전에 차단하여 충돌이 일어나지 않게 보장하지만, 자원을 점유하는 동안 다른 트랜잭션이 대기해야 하므로 성능 저하의 문제가 발생할 수 있습니다.

 

3. 마치며

 

지금까지 동시성 제어의 개념과 방법을 알아봤습니다.

방법 중에서도 데이터베이스를 통한 데이터베이스의 Lock을 활용한 방법을 알아봤습니다.

낙관적인 락, 비관적인 락을 상황에 맞게 잘 사용할 필요가 있을 것 같습니다.

 

이 포스팅에서는 다루지 않았지만 프로그램 레벨 동시성 제어 방법도 있습니다.

대표적으로 뮤텍스, 세마포어, 모니터, 락프리 프로그래밍, 읽기-쓰기 락, Atomic 클래스 등이 있습니다.

 

예전에 유데미 멀티스레드 강의를 통해 한 번 배웠었는데 내용이 많다보니 기억이 가물가물하네요.

이 부분은 추후 다시 공부해서 포스팅을 해보려고합니다. 혹시 유데미 강의 관심있으신 분은 아래 링크 참고해주세요.

 

→ 유데미 자바 멀티스레딩, 병행성 및 성능 최적화 강의 바로가기


오늘은 Lock에 대해서 한 번 알아봤습니다.

 

감사합니다!

반응형