Sequelize LOCK 정리

이 글은 AI가 작성했습니다.

개요

이 문서는 Sequelize에서 제공하는 LOCK의 종류와 사용 방법을 설명합니다.

MySQL(InnoDB)을 기준으로 실제 SQL 쿼리가 어떻게 변환되는지 설명합니다.

MySQL에서 지원하지 않는 LOCK은 개념 설명만 제공합니다.

Sequelize LOCK 개념

Sequelize의 LOCK은 트랜잭션 내에서 SELECT 쿼리에 잠금 절을 추가하기 위한 기능입니다.

주로 동시성 제어와 데이터 정합성 보장을 목적으로 사용합니다.

LOCK은 항상 트랜잭션과 함께 사용합니다.

LOCK.UPDATE

LOCK.UPDATE는 조회한 행에 배타 잠금을 설정합니다.

다른 트랜잭션은 해당 행을 수정하거나 동일한 잠금으로 조회할 수 없습니다.

사용 예시

await sequelize.transaction(async (t) => {
  await User.findOne({
    where: { id: 1 },
    lock: t.LOCK.UPDATE,
    transaction: t,
  });
});

MySQL 변환 쿼리

SELECT *
FROM Users
WHERE id = 1
FOR UPDATE;

LOCK.SHARE

LOCK.SHARE는 조회한 행에 공유 잠금을 설정합니다.

다른 트랜잭션은 조회는 가능하지만 수정은 불가능합니다.

사용 예시

await sequelize.transaction(async (t) => {
  await User.findOne({
    where: { id: 1 },
    lock: t.LOCK.SHARE,
    transaction: t,
  });
});

MySQL 변환 쿼리

SELECT *
FROM Users
WHERE id = 1
LOCK IN SHARE MODE;

LOCK.KEY_SHARE

LOCK.KEY_SHARE는 행의 인덱스 키에 대한 공유 잠금을 의미합니다.

PostgreSQL에서 주로 사용되며 MySQL에서는 지원하지 않습니다.

외래 키 무결성 보장을 목적으로 사용합니다.

LOCK.NO_KEY_UPDATE

LOCK.NO_KEY_UPDATE는 행 데이터는 수정할 수 있으나 인덱스 키 변경은 제한하는 잠금입니다.

PostgreSQL 전용 기능이며 MySQL에서는 지원하지 않습니다.

skipLocked 옵션

skipLocked 옵션은 이미 잠긴 행을 조회 결과에서 제외합니다.

큐 처리와 같이 경합이 많은 환경에서 사용합니다.

사용 예시

await sequelize.transaction(async (t) => {
  await User.findAll({
    limit: 10,
    lock: t.LOCK.UPDATE,
    skipLocked: true,
    transaction: t,
  });
});

MySQL 변환 쿼리

SELECT *
FROM Users
FOR UPDATE SKIP LOCKED;

of 옵션

of 옵션은 조인된 테이블 중 특정 테이블에만 잠금을 적용할 때 사용합니다.

PostgreSQL에서만 지원되며 MySQL에서는 무시됩니다.

정리

Sequelize의 LOCK은 데이터 정합성을 보장하기 위한 수단입니다.

MySQL에서는 FOR UPDATE와 LOCK IN SHARE MODE 중심으로 사용합니다.

나머지 LOCK 유형은 데이터베이스 종류에 따라 동작 여부가 다르므로 사용 전 확인이 필요합니다.