Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준
- java
- Spring Boot
- QueryDSL
- transaction
- 스프링
- spring
- JDBC
- 스프링 핵심 기능
- db
- jpa
- SpringBoot
- Servlet
- Greedy
- Proxy
- Thymeleaf
- 그리디
- AOP
- 알고리즘
- Exception
- kotlin
- JPQL
- 인프런
- springdatajpa
- http
- 자바
- Android
- 스프링 핵심 원리
- pointcut
- 김영한
Archives
- Today
- Total
개발자되기 프로젝트
DB 락 - 변경 본문
기본 데이터 입력
set autocommit true;
delete from member;
insert into member(member_id, money) values ('memberA',10000);
lock 0
lock 1
- 세션1
set autocommit false;
update member set money=500 where member_id = 'memberA';
- 세션1이 트랜잭션을 시작하고, memberA 의 데이터를 500원으로 업데이트 했다.
- 아직 커밋은 하지 않았다.
- memberA 로우의 락은 세션1이 가지게 된다.
lock 2
- 세션 2
SET LOCK_TIMEOUT 60000;
set autocommit false;
update member set money=1000 where member_id = 'memberA';
- 세션2는 memberA 의 데이터를 1000원으로 수정하려 한다.
- 세션1이 트랜잭션을 커밋하거나 롤백해서 종료하지 않았으므로 아직 세션1이 락을 가지고 있다.
- 따라서 세션2는 락을 획득하지 못하기 때문에 데이터를 수정할 수 없다.
- 세션2는 락이 돌아올 때 까지 대기하게된다.
- SET LOCK_TIMEOUT 60000 : 락 획득 시간을 60초로 설정한다.
60초 안에 락을 얻지 못하면 예외가 발생한다. - 참고로 H2 데이터베이스에서는 딱 60초에 예외가 발생하지는 않고, 시간이 조금 더 걸릴 수 있다.
- 세션2 락 획득
세션1을 커밋하면 세션1이 커밋되면서 락을 반납한다.
이후에 대기하던 세션2가 락을 획득하게 된다.
따라서 락을 획득한 세션2의 업데이트가 반영되는 것을 확인할 수 있다.
물론 이후에 세션2도 커밋을 호출해서 락을 반납해야 한다.
lock 3
세션1은 커밋을 수행한다. 커밋으로 트랜잭션이 종료되었으므로 락도 반납한다.
세션1이 커밋하면 이후에 락을 반납하고 다음 시나리오가 이어진다.
lock 4
락을 획득하기 위해 대기하던 세션2가 락을 획득한다.
lock 5
세션2는 update sql을 정상 수행한다.
lock 6
세션2는 커밋을 수행하고 트랜잭션이 종료되었으므로 락을 반납한다.
세션2 락 타임아웃
SET LOCK_TIMEOUT <milliseconds> : 락 타임아웃 시간을 설정한다.
예) SET LOCK_TIMEOUT 10000 10초, 세션2에 설정하면 세션2가 10초 동안 대기해도 락을 얻지 못하면
락 타임아웃 오류가 발생한다.
위 시나리오 중간에 락을 오랜기간 대기하면 어떻게 되는지 알아보자.
10초 정도 기다리면 세션2에서는 다음과 같은 락 타임아웃 오류가 발생한다
'인프런 > [인프런] 스프링 DB 1편 - 데이터 접근 핵심 원리' 카테고리의 다른 글
Transaction - 적용 1 (0) | 2022.06.07 |
---|---|
DB 락 - 조회 (0) | 2022.06.07 |
DB 락 - 개념 이해 (0) | 2022.06.01 |
트랜잭션 - DB 예제4 - 계좌이체 (0) | 2022.06.01 |
트랜잭션 - DB 예제3 - 트랜잭션 실습 (0) | 2022.06.01 |
Comments