데이터베이스의 락킹

023·2024년 7월 5일
0

database

목록 보기
8/8
post-thumbnail

데이터베이스의 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)

데이터베이스에서 다중 사용자 환경에서의 데이터 동시성을 관리하기 위해 락킹 메커니즘을 사용한다. 락킹 메커니즘은 두 가지로 분류할 수 있는데, 하나는 낙관적 락(Optimistic Lock)이고, 다른 하나는 비관적 락(Pessimistic Lock)이다. 이 두 가지 방법은 트랜잭션 간의 충돌을 관리하고 데이터의 일관성을 유지하는 데 사용된다.

낙관적 락(Optimistic Lock)

낙관적 락은 데이터 충돌이 드물게 발생할 것이라고 가정하는 방법이다. 이 방식은 데이터를 읽을 때는 락을 걸지 않고, 데이터를 수정하거나 업데이트할 때 충돌 여부를 검증한다. 낙관적 락은 주로 애플리케이션 레벨에서 관리된다.

특징

  1. 충돌 검증: 트랜잭션이 끝날 때 데이터의 상태를 확인하여 다른 트랜잭션이 데이터를 변경했는지 검증한다.
  2. 버전 관리: 보통 데이터베이스 테이블에 버전 번호(version number)나 타임스탬프(timestamp) 컬럼을 추가하여 데이터 변경 시 이를 업데이트한다.
  3. 비교적 높은 동시성: 락을 자주 사용하지 않기 때문에 높은 동시성을 제공한다.

장점

  1. 높은 성능: 락을 거의 사용하지 않기 때문에 시스템 자원을 덜 소모하고, 트랜잭션 간의 병목 현상이 적다.
  2. 간단한 구현: 애플리케이션 레벨에서 쉽게 구현할 수 있다.
  3. 높은 동시성 지원: 많은 사용자와 트랜잭션을 동시에 처리하는 환경에서 효율적이다.

단점

  1. 충돌 처리 필요: 트랜잭션 충돌이 발생하면 이를 처리하는 추가 로직이 필요하다.
  2. 재시도 로직 필요: 충돌 시 트랜잭션을 재시도해야 하므로, 이를 처리하기 위한 재시도 로직이 필요하다.

예제

MySQL에서 낙관적 락을 구현하는 예제이다. 버전 번호를 사용하는 방법을 보여준다.

  1. 테이블에 버전 번호 추가:
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Name VARCHAR(50),
    Salary DECIMAL(10, 2),
    Version INT
);
  1. 데이터 업데이트 시 버전 번호 검증 및 업데이트:
UPDATE Employees
SET Salary = Salary + 500, Version = Version + 1
WHERE EmployeeID = 101 AND Version = 1;

-- 영향을 받은 행이 0일 경우, 다른 트랜잭션에 의해 업데이트된 것으로 간주하고 재시도 로직을 구현한다.

비관적 락(Pessimistic Lock)

비관적 락은 데이터 충돌이 자주 발생할 것이라고 가정하는 방법이다. 이 방식은 데이터를 읽을 때부터 락을 걸어 다른 트랜잭션이 해당 데이터에 접근하지 못하게 한다. 비관적 락은 주로 데이터베이스 레벨에서 관리된다.

특징

  1. 락 획득: 트랜잭션이 데이터를 읽을 때 락을 걸어 다른 트랜잭션이 해당 데이터에 접근하지 못하게 한다.
  2. 강한 일관성 보장: 충돌 가능성을 사전에 차단하여 데이터의 일관성을 강하게 보장한다.
  3. 낮은 동시성: 많은 락 사용으로 인해 트랜잭션 간의 병목 현상이 발생할 수 있다.

장점

  1. 강한 일관성: 트랜잭션이 데이터에 대한 배타적 접근을 보장받으므로, 데이터의 일관성을 강하게 유지할 수 있다.
  2. 단순한 충돌 처리: 충돌이 발생할 가능성이 적어 충돌 처리 로직이 단순하다.

단점

  1. 낮은 성능: 락을 자주 사용하기 때문에 시스템 자원을 많이 소모하고, 트랜잭션 간의 병목 현상이 발생할 수 있다.
  2. 복잡한 관리: 락 해제를 제대로 관리하지 않으면 데드락(교착 상태)이 발생할 수 있다.
  3. 낮은 동시성 지원: 동시 처리되는 트랜잭션 수가 많아지면 성능이 크게 저하될 수 있다.

예제

MySQL에서 비관적 락을 구현하는 예제이다. SELECT ... FOR UPDATE 구문을 사용하는 방법을 보여준다.

  1. 비관적 락을 사용하여 데이터 읽기:
START TRANSACTION;

SELECT * FROM Employees
WHERE EmployeeID = 101
FOR UPDATE;

-- 해당 트랜잭션이 완료될 때까지 EmployeeID 101에 대한 다른 트랜잭션의 접근이 차단된다.
  1. 데이터 업데이트 및 트랜잭션 커밋:
UPDATE Employees
SET Salary = Salary + 500
WHERE EmployeeID = 101;

COMMIT;

결론

낙관적 락과 비관적 락은 데이터베이스 동시성을 제어하는 두 가지 주요 방법이다. 낙관적 락은 데이터 충돌이 드물다고 가정하고 높은 동시성을 제공하는 반면, 비관적 락은 충돌 가능성을 사전에 차단하여 데이터의 강한 일관성을 보장한다. 애플리케이션의 특성과 사용 패턴에 따라 적절한 락킹 메커니즘을 선택하는 것이 중요하다. 데이터 충돌이 자주 발생하지 않는 환경에서는 낙관적 락이, 데이터 충돌이 빈번한 환경에서는 비관적 락이 더 적합할 수 있다.

profile
Get your hands dirty

0개의 댓글