[DB] 낙관적 락 vs 비관적 락

calis_ws·2024년 3월 3일
0
post-custom-banner

Lock

락은 대표적인 동시성 제어 기법 중 하나로, 데이터베이스의 일관성과 무결성을 유지하기 위해 트랜잭션의 순차적 진행을 보장할 수 있는 직렬화 장치이다.

일반적으로 락은 둘 혹은 그 이상의 사용자가 동시에 같은 데이터를 접근하는 것을 방지하기 위해 사용한다.

트랜잭션만으로는 해결할 수 없는 요청이 유실되는 경우가 발생하는 갱신 손실 문제나 동시에 발생하는 따닥 요청등을 해결할 때 사용한다.

낙관적 락(Optimistic Lock)

자원에 락을 걸어서 선점하지말고, 동시성 문제가 발생하면 그때 가서 처리 하자는 방법론이다.

  • 트랜잭션의 충돌이 발생하지 않을 것이라고 기대한다.

  • 일단 충돌이 나는 것을 막지 않고, 충돌이 난 것을 감지하면 그때 처리한다.

  • 일반적으로 version 의 상태를 보고 충돌을 확인하며, 충돌이 확인된 경우 롤백을 진행시킨다. (hashcode나 timestamp를 이용해서 충돌을 확인할 수도 있다.)

  • DB 단에서 동시성을 처리하는것이 아닌, 어플리케이션 단에서 처리한다.

유저가 동시에 TILTE 데이터를 수정하는 상황

장점

  • 충돌이 안난다는 가정하에, 동시 요청에 대해서 처리 성능이 좋다.

단점

  • 잦은 충돌이 일어나는 경우 롤백 처리에 대한 비용이 많이 들어 오히려 성능에서 손해를 볼 수 있다.
  • 롤백 처리를 구현하는게 복잡할 수 있다.

비관적 락(Pessimistic Lock)

자원 요청에 따른 동시성 문제가 발생할 것이라고 예상하고 락을 걸어버리는 방법론이다.

  • 트랜잭션의 충돌이 발생한다고 가정한다.

  • 하나의 트랜잭션이 자원에 접근시 락을 걸고, 다른 트랜잭션이 접근하지 못하게 한다.

  • 데이터베이스에서 Shared Lock(공유, 읽기 잠금) 이나 Exclusive Lock(배타, 쓰기 잠금) 을 건다.

  • Shared Lock 의 경우, 다른 트랜잭션에서 읽기만 가능하다. 또한 Exclusive lock 적용이 불가능하다. (읽는 동안 변경하는 것을 막기 위해)

  • Exclusive lock 의 경우, 다른 트랜잭션에서 읽기, 쓰기가 둘다 불가능하다. 또한 Shared, Exclusive Lock 적용이 추가적으로 불가능하다. (쓰는동안 읽거나, 다른 쓰기가 오는것을 막기위해)

장점

  • 충돌이 자주 발생하는 환경에 대해서는 롤백의 횟수를 줄일 수 있으므로 성능에서 유리하다.
  • 데이터 무결성을 보장하는 수준이 매우 높다.

단점

  • 데이터 자체에 락을 걸어버리므로 동시성이 저하되는 성능 손해를 많이 보게 된다. 특히 읽기가 많이 이루어지는 데이터베이스의 경우에는 손해가 더 두드러진다.
  • 서로 자원이 필요한 경우에, 락이 걸려있으므로 데드락(Deadlock)이 일어날 가능성이 있으며, 이에 대한 처리가 필요하다.

데드락이란?

두 개 이상의 프로세스나 스레드가 서로가 가진 자원을 대기하며 무한히 기다리는 상황


정리

낙관적락

데이터에 대한 동시 액세스를 허용하되, 충돌을 검출하여 데이터의 일관성을 유지한다.
실제로 데이터 충돌이 자주 일어나지 않을 것이라고 예상되는 시나리오에서 좋다.

비관적락

데이터에 대한 액세스를 다른 프로세스로부터 차단하여 데이터의 일관성을 유지한다.
데이터의 무결성이 중요하고, 충돌이 많이 발생하여 잦은 롤백으로 인한 효율성 문제가 발생하는 것이 예상되는 시나리오에서 좋다.

출처

낙관적 락 VS 비관적 락 - 김영수 | 백엔드 데브코스 3기 | 20230203
https://www.youtube.com/watch?v=SoQ4ExWnetg&t=336s
https://unluckyjung.github.io/db/2022/03/07/Optimistic-vs-Pessimistic-Lock/

profile
반갑습니다람지
post-custom-banner

0개의 댓글