참고) https://velog.velcdn.com/images/paramkim/post/b7379ec4-4ace-497a-8cce-9d44237533f9/image.png

락 사용 주요 이유
- 레이스 컨디션 방지
- 데이터 정합성 유지
- 원자성 보장
- 비즈니스 로직 보호
시나리오
- 10번 트랜잭션이 이름을 update했는데 commit을 하지 않았다
- 하지만 13번 트랜잭션이 접근했을 때 commit하지 않은 데이터를 읽을 수 있다
- 여기서 10번 트랜잭션에 문제가 생겨 롤백이 된다면 13번 트랜잭션의 데이터 부정합을 발생할 수 있다
시나리오
- 10번 트랜잭션이
박기영이라는 데이터를박경으로 update을 했지만 commit을 하지 않았다- 13번 트랜잭션에서 조회할 때는
박기영이라는 값이 조회된다- 커밋된 읽기에서는 Undo 영역이라는게 있어서 Update전 값을 조회할 수 있다
- Undo 영역: 변경 전 데이터가 저장된 영역이고, Commit 하기 전 데이터를 읽어올 수 있는 이유
- 트랜잭션에 대한 복구는 어떻게 하는가? 로그를 기반으로 복구를 하게 된다.
Insert에 대한 Lock을 걸 수 없다시나리오
- 10번 트랜잭션은 10번 트랜잭션보다 작은 트랜잭션에서 커밋된 데이터만 읽을 수 있다
- 13번 트랜잭션에서 변경한 내용은 조회할 수 없다
- 같은 Select 쿼리를 두번 실행됐을 때 같은 결과가 조회되므로 반복 가능하지 않은 읽기 현상이 발생하지 않는다
- 10번 트랜잭션은 13번 트랜잭션이 데이터를 커밋했더라도 읽을 수 없다
Exclusive Lock을 사용한다Exclusive Lock(배타적 잠금, 쓰기잠금)
- 특정 레코드나 테이블에 대해 다른 트랜잭션에서 읽기, 쓰기 작업을 할 수 없도록 하는 Lock
Select for update구문을 통해 사용할 수 있다- 트랜잭션이 접근 시 Lock이 풀릴 때까지 대기하게 된다
Next Key Lock
- 조회된 레코드에 대한 Lock뿐 아니라 실행 쿼리에 대한 범위를 설정하는 Lock
- 즉 Next Key Lock은
Record Lock,Gap Lock이 조합된 Lock이다- 코드에 대한 Record Lock과
0<10<=10에 해당하는 범위에 Gap Lock이 걸린다
- 또한 조회된 레코드의 Index인 ID에 대해 그다음 존재하는 ID 까지의 범위를 Gap Lock으로 설정한다
- 만약 Id가 2인 필드 이후에 Id가 20인 레코드가 있다면 2~20까지 Gap Lock을 건다
- Select 쿼리를 통해 정해진 GAP에 해당하는 데이터를 Insert 시도할 경우 Gap Lock로 인해 대기 상태로 들어가게 된다
select 쿼리 실행 시 Shared Lock을 걸기 때문이다Insert, Update, Delete쿼리 실행 시 Exclusive Lock(MySql의 경우 Next key Lock)을 걸기 때문이다Shared Lock
- 다른 트랜잭션에서의 읽기 작업은 허용하지만, 쓰기 작업을 불가능 하도록 한다
- Select~For Share 문법을 통해 사용하며, Lock의 경우 동시에 Exclusive Lock을 허용하지 않는다
- Select 쿼리 실행시 Shared Lock이 걸리게 된다
- 다른 트랜잭션에서 Update, Delete, Insert와 같은 쿼리 실행시
Exclusive Lock, Next Key Lock을 얻어오려고 할텐데 Shared Lock이 이를 허용하지 않아 대기상태가 된다- 이러한 원리로 인해 트랜잭션들이 중간에 끼어들 수 없고 순차적으로 되는것이다
시나리오
- 트랜잭션1이 Id = 2를 업데이트 요청 이후 트랜잭션2가 Id = 2 업데이트 요청
- 트랜잭션1이 먼저 선점했기 때문에 트랜잭션2는 끝날 때까지 대기
- 트랜잭션1이 끝나면 트랜잭션2 시작 후 종료
장점
- 데이터의 일관성을 보장한다

장점
- 충돌이 자주 발생하지 않을 경우 성능 저하를 최소화시킬 수 있다
- 성능이 있고, 데드락 발생 가능성이 낮다
- 데이터를 읽는 동안 다른 트랜잭션이 해당 데이터를 변경할 수 있기 때문이다