스프링/5. 스프링 DB-1

18. DB 락

sdafdq 2023. 9. 29. 15:49

세션 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