예제의 기본 데이터
set autocommit true;
delete from member;
insert into member(member_id, money) values ('memberA',10000);
insert into member(member_id, money) values ('memberB',10000);
계좌이체 성공 SQL
set autocommit false;
update member set money=10000 - 2000 where member_id = 'memberA';
update member set money=10000 + 2000 where member_id = 'memberB';
계좌이체 문제상황
set autocommit false;
update member set money=10000 - 2000 where member_id = 'memberA'; //성공
update member set money=10000 + 2000 where member_iddd = 'memberB'; //쿼리 예외 발생
이러한 문제를 해결하기 위해 락이라는 개념을 제공
1. 세션 1은 트랜잭션을 시작.
2. 세션 1이 memberA의 money를 500으로 변경을 시도 -> 해당 로우의 락을 먼저 획득해야함.
1. 락이 남아있으므로 세션 1은 락을 획득(이 문제의 경우 세션2보다 1이 조금 더 빨리 요청을 했다는 가정)
3. 세션1이 락을 획득했으므로 해당 로우에 updata sql 수행
4. 세션1이 아직 사용하고 있는 상황에서 세션2가 트랜잭션을 시작하여 memberA의 money 데이터 변경을 시도하는데, 이때 해당 락을 획득하려고 시도하지만 이미 세션 1이 사용중이여서 락을 획득하기 위해서 대기
1. 만약 여기서 락 대기시간을 넘어가면 락 타임아웃 오류가 발생
5. 세션1이 커밋을 수행 -> 트랜잭션이 종료되어 락을 반납
6. 대기하던 세션2가 락을 획득하여 update sql 실행
7. 세션2는 커밋을 수행하고 트랜잭션이 종료되어 락을 반납한다.
SET LOCK_TIMEOUT milliseconds : 락 타임아웃 시간을 설정
데이터 조회시에도 락을 획득하고 싶을 때
조회시점에 락이 필요한 경우