[Database] Redis 분산락에 대해서
·
Database
Redis 분산락?Lettuce vs Redisson, pub/sub, 공정성, 멀티 인스턴스에서의 안전한 사용법왜 분산락이 필요한가단일 서버라면 synchronized나 DB 행락으로도 충분하다. 하지만 멀티 인스턴스(스케일 아웃) 환경에서는 서로 다른 프로세스가 같은 자원(예: 같은 주문/쿠폰/재고)을 동시에 건드릴 수 있다. 이때 처리 순서를 보장해 데이터 꼬임을 막아주는 장치가 분산락이다.Redis로 잠그는 기본 아이디어핵심은 키를 선점한 1명만 들어간다는 것.락 획득: SET my_lock NX PX NX: 키가 없을 때만 세트(선점)PX: 임대시간(lease time). 주인이 죽어도 영원히 잠기지 않도록 유효기간 부여락 해제: "내가 건 락만 푼다"를 보장해야 하므로 Lua 스크립트로 원자..
[Database] 낙관적 락(Optimistic Lock)
·
Database
해당 글은 MySql, H2 데이터베이스 기준으로 작성하였습니다.예상치 못한 상황Q. 주문을 할 때 특정 시간에 사용자 1명만 주문을 할까?Q. 우연히 2명 이상의 사용자가 같은 시각에 동시에 주문을 할 수 있지 않을까?Q. 한 사람이 주문을 동시에 여러 번 할 수 있지 않을까?'데이터베이스에서의 동시성 문제'라고 부르며, '고립성(Isolation)'이 제대로 보장되지 않아 발생하는 문제가 위와 같다. 동시에 여러 트랜잭션이 수행될 때, 트랜잭션들이 서로 간섭하지 않도록 하는 것이 고립성의 목표이다.트랜잭션의 격리 수준을 설정하여 동시성 문제를 일정 수준까지 제어할 수 있지만, 완벽하게 해결하기 위해서는 추가적인 동시성 제어 기법이 필요하다. 이때, 낙관적 락이나 비관적 락 등의 동시성 제어 기법을 사..
[Database] MySQL 문자열 대소문자 구분
·
Database
사용자의 검색 키워드와 그에 따른 결과를 보기 위해서 검색 기능을 개발하는 중 이상한 점을 발견했다. 검색 키워드를 넣고 검색을 하게 되면 아래와 같이 대소문자가 구분이 되지 않는 상태로 결과가 조회된다. MySQL 세팅 시, 대소문자 구분하지 않는 설정을 안했는데 왜 'apple'을 검색키워드로 넣었는데 왜, 'Apple', 'APPLE333'이 조회가 되는걸까?1. Application Level 분석 (Querydsl) 먼저 대소문자 구분 문제를 확인할 때, 데이터베이스 레벨보다는 애플리케이션 레벨에서의 쿼리 및 ORM(Querydsl) 설정을 살펴보았다. 애플리케이션 레벨에서 문제를 수정하는 것이 일반적으로 더 간단하고 빠르고, 쿼리나 조건을 수정하는 것이 데이터베이스 설정을 변경하는 것보다 용..