DBMS에서 트랜잭션을 특별한 제어 없이 병행 수행하게 된다면 데이터의 일관성과 무결성을 보장하기 힘들 수 있다.
사용자로 하여금 서비스의 신뢰도를 높이기 위해서는 데이터 관리를 안정적으로 수행해야하고 일관성과 무결성 보장이 중요하다.
이렇게 병행 수행되는 트랜잭션들을 제어하기 위해 락을 사용할 수 있으며 크게 공유 락과 베타 락으로 분류할 수 있다.
공유 락은 읽기 락 이라고 부른다.
여러 개의 트랜잭션이 동시에 읽기 작업을 수행할 수 있도록 허용해준다.
읽기 즉, 조회만 공동으로 수행되므로 데이터가 바뀌지안항 일관성과 무결성을 보장한다.
이 공유 락을 적용한 데이터에 대해 다른 트랜잭션에서도 공유락을 걸 수 있지만, 공유락이 걸려 있는 동안 베타락은 걸 수 없다.
SELECT * FROM table_name WHERE id = 1 FOR SHARE;
베타 락은 쓰기 락 이라고 한다.
이 베타 락이 설정되면, 다른 트랜잭션은 해당 데이터에 대해 읽기 및 쓰기 작업이 제한된다.
다시 말하면 베타 락이 걸린 데이터에 대해 다른 트랜잭션은 공유 락과 베타 락을 모두 적용할 수 없게 된다.
혹시 수정을 하는 도중에 조회가 발생하면 데이터의 일관성과 무결성이 깨져버리기 때문이다.
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
결론적으로 베타 락이 걸린 데이터는 다른 트랜잭션에서 어떤 종류의 락도 설정할 수 없기때문에 대기하는 상황이 발생할 수 있다.
데드 락은 이름에서도 알 수 있듯 좋지 않은 뜻이다..
교착 상태 를 의미하며, 두 개 이상의 트랜잭션이 서로 필요로 하는 데이터의 락을 점유하면서 발생하는데 서로를 기다리며 무한히 대기에 빠져버리는 상황을 말한다.

경력은 어디서 쌓나..
트랜잭션 A와 트랜잭션 B가 있고, id가 각각 1, 2인 데이터가 있는 상황에서 두개의 트랜잭션이 시작된다.
트랜잭션 A는 id 1번의 데이터를 읽고 2번 데이터를 변경하는 동작을 하는 트랜잭션이라고 가정한다.
트랜잭션 B는 id 2번의 데이터를 읽고 1번 데이터를 변경하는 트랜잭션이다.
이때, A와 B는 트랜잭션 시작과 동시에 각각 1번, 2번 데이터에 대해 공유 락을 획득한다.
데이터를 변경해야하는 동작인 두번째 동작을 수행하기 위해 각각의 트랜잭션은 서로 다른 데이터에 대해 락이 헤제되기를 기다린다.
이 상황이 바로 데드락 상황이다.
데드 락은 어떻게 해결해야 할까?
락을 점유 하는 순서에 대한 룰을 정해주거나 락을 하는 시간을 설정하는 방법이 있다.
@Transactional(timeout = 10)
public Trans action(Long id){
}
면접 질문 내용과 답변의 일부는 기술 면접 구독 서비스 - 매일메일 에 있다.
흥미로웠다면 구독해보는 것도 추천한다!