개념
내 트랜잭션이 아직 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 |
댓글