No cinema eu vou para eles têm quiosques de ingressos que permitem selecionar os assentos que você deseja; eles também têm um site que faz o mesmo (o site também possui um cronômetro de contagem regressiva de 30 segundos, no qual você deve escolher um lugar).
Embora eu compreenda coisas como transações de banco de dados e outras técnicas para lidar com vários usuários simultâneos, simplesmente não consigo entender como várias pessoas podem ter permissão para selecionar um assento ao mesmo tempo; é tão simples quanto o primeiro a pressionar COMPRAR obtém os assentos e a outra pessoa recebe uma mensagem de erro ou estou perdendo alguma coisa?
concurrency
mbwasi
fonte
fonte
Respostas:
O método clássico para fazer isso é usar um banco de dados transacional (para que não haja conflitos) e fazer uma alocação provisória do assento para você, que expira após algum tempo (por exemplo, 10 minutos para quiosques) que oferece tempo suficiente para você pagar. Se a transação (visível ao cliente) cair ou atingir o tempo limite, a alocação de assentos poderá ser liberada novamente no pool. (Todas as alterações de estado são processadas por meio do banco de dados transacional, e uma transação visível ao cliente pode exigir muitas transações no nível do banco de dados.)
As companhias aéreas usarão um sistema semelhante (embora muito mais complexo devido à necessidade de lidar com várias pernas de vôo!) Para reservar assentos online. Eu imaginaria que o tempo limite seria consideravelmente maior; as passagens aéreas geralmente são reservadas com mais antecedência do que as passagens de cinema e também são mais caras.
fonte
Os 30 segundos que você viu são hoje em dia mais do que 15 minutos. Não acredito que haja uma transação de banco de dados ativa por esse período.
Se eu fosse projetar esse sistema, é assim que eu faria: Ter os objetos de negócios
Booking
eReservation
. As reservas são essencialmente confirmadas (ou seja, pagas). Eu os armazenaria na mesma tabela do banco de dados e distinguiria por um atributo ou dois.Ao buscar assentos disponíveis, você consulta consultas e reservas.
Quando alguém seleciona um assento, você cria uma nova reserva, mostrando assim a outros clientes o assento como ocupado. Uma segunda reserva para o mesmo lugar será recusada - a atualização ou inserção do banco de dados falhará. Se o cliente confirmar / pagar pela reserva, você fará a transição para uma reserva. Em um trabalho em lotes periódico, você exclui todas as reservas com mais de 15 minutos (ou a qualquer momento que você der a seus clientes).
fonte
Ele acompanha a propriedade ACID do banco de dados - Isolamento. O banco de dados usa bloqueios nos dados para evitar modificações simultâneas dos dados.
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
fonte
Existem pelo menos 2 processos de negócios envolvidos aqui.
Mostrar assentos disponíveis.
Reserve um assento selecionado.
Como esses processos não se seguem imoderadamente, e como duas pessoas podem selecionar o mesmo lugar, surge o problema de concorrência.
Se o design do banco de dados atribuir a restrição de exclusividade correta para que a combinação de:
-TheaterID
-SeatID
-EventID
são exclusivos, o banco de dados evitará duplicatas.
O cenário a seguir também é possível, mas será resolvido pela implementação sugerida acima:
Supondo que uma visualização em grade disponível para um determinado teatro e um determinado evento possa ser exibida:
Portanto, tudo o que você precisa fazer pode ser nada mais do design do banco de dados correto e escolha adequada das restrições.
Outras abordagens mais complexas são possíveis, se você desejar, usando filas de transações. Nesse caso, as solicitações são gravadas primeiro em uma fila e, em seguida, acionam um processo a cada n segundos, mas isso dificilmente é necessário ou prático no seu caso.
A parte realmente interessante é o que a grade da lista para o usuário 1 deve mostrar?
fonte
Você pode evitar a condição de corrida se atrasar a alocação de assentos específicos.
fonte