두개의 세션이 있고, 세션1이 데이터를 수정하는 동안 커밋을 수행하지 않았는데, 세션2가 동시에 같은 데이터를 수정했다고 해보자.
이러면 트랜잭션의 원자성이 깨져버린다…
이런 문제를 방지하기 위해 DB는 락(LOCK)이라는 개념을 도입한다.
세션1이 특정 row의 데이터를 수정하기 위해 트랜잭션을 시작했다고 해보자.
그럼 세션1은 해당 row의 락을 먼저 획득한다.
락을 획득했으므로 update쿼리를 수행할 수 있다.
이때 세션2도 같은 row의 데이터를 수정하려고 해도, 해당 row의 락이 없기 때문에 데이터를 수정할 수 없다.
💡 참고로 락을 반환받기 위해 무한정 대기하지는 않는다. 정해진 락 대기시간을 넘어서면 타임아웃오류가 발생한다.
세션2는, 세션2이 커밋 등으로 트랜잭션을 끝마치고 반환한 락을 획득했을때에서야 본인도 데이터를 수정할 수 있다.
실습해보자.