영화관 좌석 예약 시스템은 어떻게 여러 사용자가 같은 좌석을 예약하지 못하게합니까?


34

영화관에는 내가 원하는 좌석을 선택할 수있는 티켓 키오스크가 있습니다. 그들은 또한 같은 웹 사이트를 가지고 있습니다 (웹 사이트에는 좌석을 선택 해야하는 30 초와 같은 카운트 다운 타이머가 있습니다).

데이터베이스 트랜잭션 및 여러 명의 동시 사용자를 처리하기위한 기타 기술과 같은 사항을 이해하지만 여러 사람이 동시에 한 자리를 선택할 수있는 방법에 대해 이해하지 못합니다. BUY를 누르는 첫 번째 사람이 자리를 잡고 다른 사람에게 오류 메시지가 표시되는 것처럼 간단합니까?


10
"구매를 누르는 첫 번째 사람이 자리를 잡고 다른 사람이 오류 메시지를받는 것처럼 간단합니다." 그.
yannis

2
그래, 아마도 12 대의 기계처럼 바쁜 날에는 고통 스러울 것 같습니다.
mbwasi

2
아마도 사용자는 대부분의 시간을 다른 화면 (지불 세부 사항 입력, 티켓 인쇄 대기 등)에서 소비하므로 모두 동시에 좌석을 선택하지는 않습니다. 모든 사람이 동일한 좌석 선호도를 가지므로 동시에 피킹하는 사람들도 다른 좌석을 선택할 수 있습니다. 나는 그렇게 많은 충돌이있을 것으로 기대하지는 않을 것이다.
Dave Sherohman

2
@JimG. 가능한 모든 솔루션에 대해 두 고객이 모두 정확히 똑같은 시간 (밀리 초)에 구매를하면 하나는 제공되고 다른 하나는 일종의 오류 메시지를 받게됩니다. 그러한 일이 일어날 가능성을 최소화하는 아름다운 방법이 있지만 (답변에 설명 된 바와 같이 기술적이고 개념적인) 특별한 상황에서는 한 요청이 처리되고 다른 요청은 실패합니다. 저것과 같이 쉬운.
yannis 2011

3
@JimG. 그것은 행동의 유형이 아닙니다. 두 요청이 모두 정확히 같은 시간에 도달하면 동시성은 작동합니다. 물론 Hand-E-Food의 의견에서와 같이 멋진 오류 메시지를 작성할 수는 있지만 한 가지 요청을 처리하고 다른 요청을 처리하는 것만 큼 간단합니다. 나는 실패가 가능한 한 사용자 친화적이거나 그 주위를 보호해서는 안된다는 것을 보장하기 위해 모든 것을해서는 안된다는 말은 아닙니다.
yannis

답변:


27

이 작업을 수행하는 전형적인 방법은 트랜잭션 데이터베이스를 사용하여 (충돌이 발생하지 않도록 ) 충분한 시간을 제공하는 일정 시간 (예 : 키오스크의 경우 10 분) 후에 만료되는 좌석을 임시로 할당 하는 것입니다. 지불. (고객이 볼 수있는) 트랜잭션이 실패하거나 시간 초과되면 좌석 할당을 풀로 다시 릴리스 할 수 있습니다. (모든 상태 변경은 트랜잭션 데이터베이스를 통해 처리되며 고객이 볼 수있는 트랜잭션 하나에는 많은 데이터베이스 수준 트랜잭션이 필요할 수 있습니다.)

항공사는 온라인으로 좌석을 예약하기 위해 유사한 시스템 (여러 비행 다리를 처리해야하기 때문에 훨씬 더 복잡하지만)을 사용합니다. 타임 아웃이 상당히 길어질 것입니다. 비행기 표는 보통 영화 표보다 더 빨리 예약되며, 더 비쌉니다.


내 지역 영화관은 실제로 좌석을 정상적으로 할당하지 않습니다. 대신, 그들은 좌석을 과잉 프로비저닝하여 사람들이 최소한의 소란을 피울 수있게했습니다. 다른 기술이지만 질문과 관련이없는 기술입니다!
Donal Fellows

스포츠 행사를위한 좌석 선택과 유사합니다. 실제로 원하는 좌석 수를 결정하고 결제를 완료하는 동안 N 개의 좌석 수가 3 분 동안 예약됩니다.
AndyMcKenna

예를 들어 항공사 좌석 구매와 같은 두 가지 프로세스가 있습니다. 먼저 좌석이 할당되지 않은 항공권을 구매합니다. 둘째, 탑승권을 받으면 (또는 온라인으로 체크인하면) 좌석이 생깁니다. 티켓의 수는 평균적으로 특정 숫자가 항공편에 표시되지 않기 때문에 실제로 과매도됩니다. 그러나 좌석 배정은 체크인 할 때 임의로 좌석 (선착순)을 할당 한 다음 사용 가능한 좌석을 선택한 다음 한 번의 거래로 환승하여 좌석을 변경할 수 있도록하는 것으로 보입니다. .
Scott Whitlock

2
@DonalFellows 잠정 할당 부분을 좀 더 설명해 주시겠습니까? 일정 기간 동안 사용자를 위해 일부 좌석을 예약한다는 의미입니까? 나는 아직도 이런 유형의 시스템에서 직면 한 문제들을 해결하려고 노력하고있다.
Sandeepan Nath

1
@SandeepanNath 의견에 적절하지 않지만 원칙은 간단합니다. 좌석은 "임시 할당"상태가되고 해당 상태의 시간 초과가 동시에 기록됩니다. 예약이 완료되면 좌석이 완전히 할당됩니다. 그렇지 않은 경우 타임 아웃에 도달하면 좌석은 (결과적으로) 주 수영장으로 다시 이동합니다. (또한 사용자가 명시 적으로 취소하면 좌석이 수영장으로 직접 이동합니다. 기다릴 필요가 없습니다.)
Donal Fellows

4

당신이 본 30 초는 요즘 15 분 정도입니다. 그 기간 동안 데이터베이스 트랜잭션이 활성화되어 있다고 생각하지 않습니다.

이러한 시스템을 설계하려면 다음과 같이하십시오. 비즈니스 오브젝트 BookingReservation. 예약은 본질적으로 확인 (즉, 유료) 예약입니다. 나는 그것들을 같은 DB 테이블에 저장하고 속성으로 구별합니다.

사용 가능한 좌석을 가져올 때 예약과 예약을 모두 쿼리합니다.

누군가 좌석을 선택하면 새로운 예약이 생성되어 다른 고객에게 좌석이 표시됩니다. 동일한 좌석에 대한 두 번째 예약이 거부됩니다-DB 업데이트 또는 삽입이 실패합니다. 고객이 예약을 확인 / 지불하면 예약으로 전환합니다. 주기적 배치 작업에서는 15 분보다 오래된 모든 예약을 삭제합니다 (또는 고객에게 제공 할 때마다).



1

여기에는 최소 2 개의 비즈니스 프로세스가 포함됩니다.

  • 하나를 처리하십시오.

이용 가능한 좌석을 보여줍니다.

  • 두 번째 과정 :

선택한 좌석을 예약하십시오.

이러한 프로세스는 서로 적절하게 따르지 않기 때문에 두 사람이 같은 자리를 선택할 수 있기 때문에 동시성 문제가 발생합니다.

데이터베이스 디자인이 다음과 같은 조합으로 올바른 고유 제한 조건을 지정하는 경우 :

극장 ID

-SeatID

-이벤트 ID

고유 한 경우 데이터베이스가 중복을 방지합니다.

다음과 같은 시나리오도 가능하지만 위에서 제안한 구현으로 처리됩니다.

주어진 극장 및 주어진 이벤트에 대해 사용 가능한 격자보기를 가정 할 수 있습니다.

  1. User1은 사용 가능한 좌석을 표시하고 좌석 1과 2를 얻습니다.
  2. User2는 사용 가능한 좌석을 표시하고 좌석 1과 2를 얻습니다.
  3. User1은 전화로 고객과 조금 대화합니다.
  4. 사용자 2가 가서 고객을 위해 좌석 2를 예약합니다
  5. User1이 고객의 좌석 2를 예약하려고합니다 (화면에 사용 가능한 것으로 표시되어 있기 때문에)
  6. 고유 인덱스는 5 단계에서 데이터를 통근하지 못하게합니다.

따라서 당신이해야 할 일은 더 정확한 데이터베이스 디자인과 제약 조건에 대한 적절한 선택 일 수 있습니다.

원하는 경우 트랜잭션 큐를 사용하여 더 복잡한 다른 방법이 가능합니다. 이 경우 요청은 먼저 대기열에 기록 된 다음 n 초마다 프로세스를 시작하지만 사용자의 경우에는 거의 필요하지 않거나 실용적이지 않습니다.

정말 흥미로운 부분은 사용자 1의 목록 표에 무엇을 표시해야 하는가입니다.


1

특정 좌석 할당을 지연 시키면 경쟁 조건을 피할 수 있습니다.

  1. 고객으로부터 좌석 선호도 수집 (좌석 수, 가격, 극장 면적, 인접 좌석 필수 등)
  2. 요청한 좌석 환경 설정을 대기열에 저장
  3. 좌석에서 일대일 좌석 요청을 가져오고 선호도에 따라 할당 된 좌석과 좌석이 발견되면 예약이 완료됩니다.
  4. 예약이 완료되면 고객에게 알리고 우편 티켓을 보내십시오. 그렇지 않으면 고객이 선호하는 티켓과 일치하는 티켓이 없음을 고객에게 알립니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.