Untitled

개요

한정된 자원인 사물함에 대해 대여 서비스인 Cabi를 진행하면서 동시성 문제를 겪었었다.
트랜잭션과 격리수준에 대해 간략히 설명하고, 이전의 Nest.js에서 해결했던 방법과, 지금 새로이 Spring으로 포팅하면서 해결하고자 한 방법들에 대해서 써보려고 한다.

(장문 주의)


동시성 문제?

유명한 문제 중 하나인 **‘식사하는 철학자 문제’**와 같이, 정해진 자원에 대해, 스레드나 프로세스가 동시적인 점유와 조작을 시도했을 때, 의도하지 않은 결과가 발생하는 것을 의미한다.

자세한 내용은 이곳을 참조하면 좋을 것 같다.


문제 상황

까비에서 서비스로 제공하는 사물함의 종류는 1인 상한의 개인 사물함, 그리고 3인 상한의 공유 사물함이 있다.

한정된 자원에 대한 점유를 위해 여러 명이 동시에 시도하는 경우, 특별한 조치가 없다면 개인 사물함에 4명이 들어가고, 공유 사물함에 10명도 들어갈 수 있는 문제가 생길 수 있다.

이를 위해 서비스에서 사용될 수 있는 트랜잭션의 방법을 생각해보고, 적용하여 해결해야 한다.

트랜잭션?

**트랜잭션(Transaction)**은 시스템에서 사용되는 더 이상 쪼갤 수 없는 업무 처리의 최소 단위이다.

예를 들어, A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤 수가 없는 하나의 트랜잭션을 구성한다.

만약 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다.

이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 하나의 거래내역으로 처리되어야 하는 단일 거래이다.

이런 거래의 최소 단위를 트랜잭션이라고 한다.

트랜잭션 처리가 정상적으로 완료된 경우 커밋(반영)을 하고, 오류가 발생할 경우 원래 상태대로 롤백(되돌리기)을 한다.

트랜잭션 더 알아보기

격리수준?

**격리 수준(Isolation Level)**은 동시에 실행되는 여러 트랜잭션 간의 상호 작용을 제어하는 데이터베이스의 속성이다. 일반적으로 지원되는 네 가지 격리 수준으로는 READ UNCOMMITTED, READ COMMITTED, REAPEATABLE READ, SERIALIZABLE이 있다.

격리수준 더 알아보기