본문 바로가기
RDBMS/mysql

mysql named lock 에 대해서

by Bill Lab 2024. 12. 27.
728x90

분산락이라고 하면 레디스 기반으로 처리하는것이 일반적이다.

하지만, 개발 조직이 소규모이고, 레디스를 사용하는 것에 대해 기술적 비용적 부담이 있다라고 하면 손쉽게 mysql 기능 중 하나인 named lock 을 기반으로 분산락을 구현할 수 있다.

 

MySQL의 GET_LOCK()과 RELEASE_LOCK() 함수를 이용해 보자!

 

1. GET_LOCK(lock_name, timeout)

    : 지정된 이름으로 락을 획득하려고 시도(timeout 은 초기반)

 

2. RELEASE_LOCK(lock_name): 지정된 이름의 락을 해제

 

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface NamedLockRepository {

    //락 획득
    @Query(value = "SELECT GET_LOCK(:lockName, :timeout)", nativeQuery = true)
    Integer getLock(@Param("lockName") String lockName, @Param("timeout") int timeout);

    //락 해제
    @Query(value = "SELECT RELEASE_LOCK(:lockName)", nativeQuery = true)
    Integer releaseLock(@Param("lockName") String lockName);
}

 

 

@Service
public class NamedLockService {

    @Autowired
    private NamedLockRepository namedLockRepository;

    @Transactional
    public void Test(String lockName) {
        //lockName 기반으로 락을 획득하려고 시도 (최대 10초 대기)
        Integer lockResult = namedLockRepository.getLock(lockName, 10);
        
        if (lockResult == 1) {
            try {
              
                // 비즈니스 로직 실행
            
            } finally {
                // 락 해제
                namedLockRepository.releaseLock(lockName);
            }
        } else {
            // 락을 획득하지 못한 경우: 재시도를 할건지, 고민 필요)
            
        }
    }
}

 

lockName 기반이기 때문에, 겹치지 않는 락의 경우 네이임을 다르게 가져가면 된다.

여기서 핵심은, 락을 획득하지 못했을 경우 어떻게 처리하냐 이다.

728x90

'RDBMS > mysql' 카테고리의 다른 글

mysql docker 실행하기  (0) 2025.01.29
MySQL Replication 구성 방법  (1) 2024.10.02