락은 대표적인 동시성 제어 기법 중 하나로, 데이터베이스의 일관성과 무결성을 유지하기 위해 트랜잭션의 순차적 진행을 보장할 수 있는 직렬화 장치이다.
일반적으로 락은 둘 혹은 그 이상의 사용자가 동시에 같은 데이터를 접근하는 것을 방지하기 위해 사용한다.
트랜잭션만으로는 해결할 수 없는 요청이 유실되는 경우가 발생하는 갱신 손실 문제나 동시에 발생하는 따닥 요청등을 해결할 때 사용한다.
자원에 락을 걸어서 선점하지말고, 동시성 문제가 발생하면 그때 가서 처리 하자는 방법론이다.
트랜잭션의 충돌이 발생하지 않을 것이라고 기대한다.
일단 충돌이 나는 것을 막지 않고, 충돌이 난 것을 감지하면 그때 처리한다.
일반적으로 version 의 상태를 보고 충돌을 확인하며, 충돌이 확인된 경우 롤백을 진행시킨다. (hashcode나 timestamp를 이용해서 충돌을 확인할 수도 있다.)
DB 단에서 동시성을 처리하는것이 아닌, 어플리케이션 단에서 처리한다.
자원 요청에 따른 동시성 문제가 발생할 것이라고 예상하고 락을 걸어버리는 방법론이다.
트랜잭션의 충돌이 발생한다고 가정한다.
하나의 트랜잭션이 자원에 접근시 락을 걸고, 다른 트랜잭션이 접근하지 못하게 한다.
데이터베이스에서 Shared Lock(공유, 읽기 잠금) 이나 Exclusive Lock(배타, 쓰기 잠금) 을 건다.
Shared Lock 의 경우, 다른 트랜잭션에서 읽기만 가능하다. 또한 Exclusive lock 적용이 불가능하다. (읽는 동안 변경하는 것을 막기 위해)
Exclusive lock 의 경우, 다른 트랜잭션에서 읽기, 쓰기가 둘다 불가능하다. 또한 Shared, Exclusive Lock 적용이 추가적으로 불가능하다. (쓰는동안 읽거나, 다른 쓰기가 오는것을 막기위해)
두 개 이상의 프로세스나 스레드가 서로가 가진 자원을 대기하며 무한히 기다리는 상황
데이터에 대한 동시 액세스를 허용하되, 충돌을 검출하여 데이터의 일관성을 유지한다.
실제로 데이터 충돌이 자주 일어나지 않을 것이라고 예상되는 시나리오에서 좋다.
데이터에 대한 액세스를 다른 프로세스로부터 차단하여 데이터의 일관성을 유지한다.
데이터의 무결성이 중요하고, 충돌이 많이 발생하여 잦은 롤백으로 인한 효율성 문제가 발생하는 것이 예상되는 시나리오에서 좋다.
낙관적 락 VS 비관적 락 - 김영수 | 백엔드 데브코스 3기 | 20230203
https://www.youtube.com/watch?v=SoQ4ExWnetg&t=336s
https://unluckyjung.github.io/db/2022/03/07/Optimistic-vs-Pessimistic-Lock/