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 |