데이터베이스에서 다중 사용자 환경에서의 데이터 동시성을 관리하기 위해 락킹 메커니즘을 사용한다. 락킹 메커니즘은 두 가지로 분류할 수 있는데, 하나는 낙관적 락(Optimistic Lock)이고, 다른 하나는 비관적 락(Pessimistic Lock)이다. 이 두 가지 방법은 트랜잭션 간의 충돌을 관리하고 데이터의 일관성을 유지하는 데 사용된다.
낙관적 락은 데이터 충돌이 드물게 발생할 것이라고 가정하는 방법이다. 이 방식은 데이터를 읽을 때는 락을 걸지 않고, 데이터를 수정하거나 업데이트할 때 충돌 여부를 검증한다. 낙관적 락은 주로 애플리케이션 레벨에서 관리된다.
MySQL에서 낙관적 락을 구현하는 예제이다. 버전 번호를 사용하는 방법을 보여준다.
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name VARCHAR(50),
Salary DECIMAL(10, 2),
Version INT
);
UPDATE Employees
SET Salary = Salary + 500, Version = Version + 1
WHERE EmployeeID = 101 AND Version = 1;
-- 영향을 받은 행이 0일 경우, 다른 트랜잭션에 의해 업데이트된 것으로 간주하고 재시도 로직을 구현한다.
비관적 락은 데이터 충돌이 자주 발생할 것이라고 가정하는 방법이다. 이 방식은 데이터를 읽을 때부터 락을 걸어 다른 트랜잭션이 해당 데이터에 접근하지 못하게 한다. 비관적 락은 주로 데이터베이스 레벨에서 관리된다.
MySQL에서 비관적 락을 구현하는 예제이다. SELECT ... FOR UPDATE
구문을 사용하는 방법을 보여준다.
START TRANSACTION;
SELECT * FROM Employees
WHERE EmployeeID = 101
FOR UPDATE;
-- 해당 트랜잭션이 완료될 때까지 EmployeeID 101에 대한 다른 트랜잭션의 접근이 차단된다.
UPDATE Employees
SET Salary = Salary + 500
WHERE EmployeeID = 101;
COMMIT;
낙관적 락과 비관적 락은 데이터베이스 동시성을 제어하는 두 가지 주요 방법이다. 낙관적 락은 데이터 충돌이 드물다고 가정하고 높은 동시성을 제공하는 반면, 비관적 락은 충돌 가능성을 사전에 차단하여 데이터의 강한 일관성을 보장한다. 애플리케이션의 특성과 사용 패턴에 따라 적절한 락킹 메커니즘을 선택하는 것이 중요하다. 데이터 충돌이 자주 발생하지 않는 환경에서는 낙관적 락이, 데이터 충돌이 빈번한 환경에서는 비관적 락이 더 적합할 수 있다.