본문 바로가기
Spring/Spring DB

DB Lock

by YellowCow 2025. 7. 18.

개념

내 트랜잭션이 아직 commit되지 않았을 때, 다른 세션의 사용자가 데이터를 변경하는 것을 막는 것

예) A의 트랜잭션이 먼저 시작되었고 아직 commit이 안 됐을 때, B가 데이터를 변경하는 것을 막는다

등장배경

어느 학습시스템에 수료증발급 기능이 있다고 치자.

수료증에는 발급번호가 부여되며, 발급번호는 순차적으로 부여되어야 한다

발급번호 생성을 위해, 발급번호의 최대값을 조회한 뒤 최대값에 1을 더하는 동작을 비즈니즈 로직에서 처리한다

public int createDocNo(){
    int max = getMax()
    return max+1;
}

A라는 사용자가 수료증 발급번호 생성을 위해 최대값을 조회 후 max+1을 실행하는 도중에

만약, B가 수료증 발급번호 생성을 시도해서 최대값을 변경하려고 하면 어떻게 될까?

발급번호가 중복되는 경우가 발생할 것이다.

 

상세설명

이를 위해서 한 사용자가 어떤 Row에 대해 작업중인 경우

다른 사용자가 값 변경을 하지 못 하도록 특정 Row에 Lock을 거는 것을 DB Lock이라고 한다

 

DB Lock은 Update시 또는 Select For Update시에 Lock을 걸 수 있다

 

Select For Update의 경우, 값 변경을 위한 select쿼리를 사용할 때 이용된다

 

lock을 먼저 건 사용자의 트랜잭션이 commit될까지 기다린 후 다른 사용자의 update 쿼리가 처리된다

 

다만, 무한정 lock을 기다리지 않고 timeout이 존재한다

 

timeout에 도달하면 에러가 발생한다

'Spring > Spring DB' 카테고리의 다른 글

문제해결 - 트랜잭션 동기화 문제  (1) 2025.07.19
문제해결 - 트랜잭션 처리 코드 반복 문제  (0) 2025.07.19
DB Connection  (0) 2025.07.18
트랜잭션  (0) 2025.07.18
DataSource  (0) 2025.07.17

댓글