TRANSACTION를 활용한 실시간 예약중 중복 예약 방지하는 방법 1
아트스퀘어
2023.02.27 14:59
3,754
0
본문
mssql 쿼리로 실시간 온라인 예약 서비스 제공시 중복 예약되는 문제점을 해결하는 대한이다.
그러나 이와 같은 MSSQL 쿼리문을 활요한 해결안은 권장하는 방법은 아니다.
이용자 수와 비래한 부하의 문제가 항상 따라 붙기 때문이다.
물론 서버의 스펙이 빵빵하고 최적화가 잘된 상태라면 뭐 말할것도 없이 매우 효과적인 방법이겠지만, 대부분 그렇지 못하기 때문에
선택은 본인들이~~~
BEGIN TRANSACTION
DECLARE @count INT
SELECT @count = COUNT(*) FROM Reservation WHERE StartTime <= @endTime AND EndTime >= @startTime
IF @count = 0
BEGIN
INSERT INTO Reservation (StartTime, EndTime, Name, Phone) VALUES (@startTime, @endTime, @name, @phone)
COMMIT TRANSACTION
END
ELSE
BEGIN
RAISERROR ('Already booked', 16, 1)
ROLLBACK TRANSACTION
END
1
위의 쿼리문에서 "Reservation" 테이블은 예약 정보가 저장되는 테이블이고, "StartTime", "EndTime", "Name". "Phone" 은 예약하는 기본적 정보들이다.
TRANSACTION은 "BEGIN
TRANSACTION"으로 시작해 "COMMIT TRANSACTION"으로 마무리 된다.
먼저 "COUNT(*)"을 사용해 해당 시간 범위에 예약된 예약 정보를 체크하고 그 갯수를 반환한다.
조회된 COUNT 값이 0인 경우에는 "INSERT"문으로 예약정보를 저장하고 "COMMIT TRANSACTION"으로 종료한다.
그러나 COUNT 값이 0보다 큰 수를 반환하게 되면 해당 시간에 예약이 존재하는것이므로 "RAISERROR"로 에러메세지를 출력하고 "ROLLBACK TRANSACTION"으로 드랙젝션을 취소하는 것이다.
비교적 말로 풀어서 설명하니 복잡하고 다소 난해하게 느껴지지만, 결국 원리는 DB에서 쿼리만으로 예약여부를 체크한다는 것이다.
댓글목록 0