세션 1이 아직 commit을 안했는데
세션 2에서 (혹은 세션 1에서도) 같은 데이터를 접근 시 수정하면 뭔가 문제가 될 수도 있다.
그래서, 세션 1이 그 데이터들을 commit 혹은 rollback 하기 전 까지 lock 해 버린다.
아마
bool isAutoCommitMode = false;
static ArrayList<Data> temps;
이런 식으로 각 세션마다 되어 있고,
실제 데이터 등록하는 그런 거는
cud(Data data)
foreach( Data tempData : temps){
if(tempData.equals(data)){
throw new Error("data is Locked");
}
}
~~~~
temps.add(data);
if(isAutoCommitMode){
data.commit();
temps.remove(data);
}
이런 느낌이 아닐까?
추가로
commits(){
foreach( Data tempData : temps){
tempData.commit();
}
}
뭐 이런 식이지 않겠음?
근데, 락 이라는 표현은 위 코드처럼 막는다는 느낌보다, 상태라는 느낌인데,
Data 자체가 isLock 이런 식으로 boolean 필드를 가지고 있지 않을 까 생각해 봄.
또, commit은 자기 세션의 임시데이터를 commit하는 것 이므로 Data마다 어느 세션인지 세션id도 붙을 듯.
그러니까 행동 하기 전에 if(tempData.sessionId === this.sessionId) 이렇게 확인하는 느낌으로
데이터의 우선권은 먼저 접근한 세션이 우선권을 가진다.
세션 1이 우선 접근한 경우
락을 획득하고
update를 임시로 해 놓는다. (tempData를 이 section에서만 그렇게 조회됨).
락이 있어야 변경이 가능하다.
만약 세션2가 같은 데이터에 접근하려고 하면, 먼저 락을 획득하려고 시도한다.
무한정 시도하는 것은 아니고, timeout DB에서 시간초과 에러 뜨는 게 이거였다.
락 획득 시도를 계속하는데 지정한 시간(기본은 1초)동안 락을 안주니 에러를 띄우게 한 것이다.
이 시간은 바꿀 수 있다. (SET LOCK_TIMEOUT 60000;)
세션 1 commit 후. 락을 돌려 놓음
세션2가 timeout 시간 전에 lock을 획득했다면, 그제서야 락을 획득하고 데이터를 바꿈.
얘도 commit 혹은 rollback을 하면 lock 반납.
'스프링 > 5. 스프링 DB-1' 카테고리의 다른 글
20. 이체 테스트 (0) | 2023.09.30 |
---|---|
19. 조회할 때 락 가져오기 (0) | 2023.09.30 |
16. 자동커밋, 수동 커밋 (0) | 2023.09.29 |
15. 트랜잭션 개념 (0) | 2023.09.28 |
14. DB 연결 구조와 DB 세션 (0) | 2023.09.28 |