database

비관적 락(Pessimistic Lock)

비관적 락 (Pessimistic Lock)은 데이터에 접근하는 동안 다른 작업이 접근하지 못하도록 강제로 락을 걸어 충돌을 방지하는 방식을 의미합니다. 따라서 비관적 락은 충돌방지를 위해, 충돌이 많이 일어날 수 있다고 판단되는 환경에서 사용되기 때문에 성능이 좋지 않습니다.


비관적 락은 자원의 경쟁을 비관적으로 바라봅니다. 따라서 다중 트랜잭션이 동시에 데이터를 수정한다고 가정합니다. 동시 접근을 막기 때문에 동시성이 떨어지고, 자원을 점유한 채 서로의 자원을 요청하는 데드락 상황이 발생할 수 있습니다.

동시성 이슈

은행에서 다음과 같은 요구사항이 있다고 가정해 보겠습니다. 온라인 뱅킹 시스템에서 두 사용자가 동일한 계좌에서 동시에 출금을 시도합니다.


- 게좌 잔액 : 10000원
- 사용자 A가 7000원 출금
- 사용자 B가 5000원 출금

사용 시나리오는 아래와 같습니다.


  1. 사용자 A가 계좌 데이터를 읽어 잔액이 10000원임을 확인합니다.
  2. 사용자 B도 동시에 같은 계좌 데이터를 읽어 잔액이 10000원임을 확인합니다.
  3. 사용자 A/B는 출금한 금액을 차감합니다.

📖 비관적 락 사용 전 결과

  1. 사용자 A가 7000원을 출금하여 잔액을 3000원으로 업데이트합니다.
  2. 사용자 B는 여전히 10000원이라고 생각하여 5000원을 출금하여 잔액을 -2000원으로 업데이트합니다.

결과적으로 계좌의 잔액은 -2000원이 되어 데이터 무결성이 깨집니다.

📖 비관적 락 사용 후 결과

사용자 A가 계좌를 조회하여 사용 중일 때는 다른 사용자는 계좌에 접근할 수 없습니다. 따라서 사용자 A의 작업이 완료된 후에 조회를 진행하므로, 무결성이 깨지지 않습니다. 비관적 락을 사용하면, 계좌 A에 대한 업데이트가 완료되기 전까지 다른 프로세스가 데이터에 접근할 수 없도록 합니다.

정리

비관적 락(Pessimistic Lock)은 데이터의 무결성을 강력하게 보장하기 때문에, 충돌이 자주 발생하는 환경에서 효과적입니다. 하지만, 락으로 인해 다른 프로세스가 대기해야 하므로 성능 저하가 발생할 수 있고 데드락(Deedlock) 위험이 존재합니다.


📝 Word

Deadlock

데드락(Deadlock)이란, 두 개 이상의 작업이 서로 자원을 점유한 상태에서 상대방의 자원을 기다리며 영원히 진행되지 못하는 상태를 말합니다.

Embedding Pattern
 - 스레드 1 : A 정보를 구하고 잠금
 - 스레드 2 : B 정보를 구하고 잠금
 - 스레드 1 : B 정보를 구할 블로킹
 - 스레드 2 : A 정보를 구할 블로킹

Dirty Read

특정 트랜잭션에 처리가 완료되지 않은 데이터를 다른 트랜잭션에서 확인 할 수 있는 현상을 의미합니다. dirty read를 허용하게 되면, 데이터가 나타났다가, 사라졌다가 하는 현상을 초래하기 때문에 정합성 문제가 발생합니다.

Non-Repeatable Read

하나의 트랜잭션에서 동일한 Select 쿼리를 실행 시 다른 결과가 표출되는 현상으로, 결제와 같은 중요한 데이터를 다룰 시에 큰 문제를 발생 시킬 수 있습니다.

Phantom Read

하나의 트랜잭션에서 없던 데이터가 생기는 현상을 말합니다.


참고 링크