Você está muito perto de seu projeto, mas não exatamente lá.
Antes de tudo, sua mesa de eventos precisa conter o número de ingressos ainda disponíveis para o seu evento (além de qualquer outra coisa que você queira lá).
Segundo, sua tabela de caução precisa ter uma coluna DATETIME indicando quando a caução expira. Você precisa definir esse valor sempre que os ingressos entrarem em custódia.
Em terceiro lugar, a transação de colocar os bilhetes em caução precisa
- bloqueie a linha do evento.
- leia a coluna de tickets disponíveis. (interromper se não houver o suficiente)
- inserir uma linha na tabela de garantia
- atualize a linha do evento para diminuir a coluna de ingressos disponíveis.
- desbloqueie a linha do evento.
Quarto, a ação de concluir a venda precisa excluir a linha de caução e inserir uma linha de bilhete vendido. Isso não é difícil.
Quinto, você precisa de uma operação de limpeza de custódia. Isso precisa procurar todas as linhas de caução que expiraram (que têm uma data de expiração no passado) e, para cada uma:
- bloqueie a linha de evento correspondente.
- leia o número de tíquetes em garantia na tabela de garantia
- exclua a linha da tabela de caução.
- atualize a linha do evento para incrementar a coluna de ingressos disponíveis.
- desbloqueie a linha do evento.
O truque é ter o número de disponíveis ingressos mantidos de uma maneira que seja interligada corretamente, para que as condições de corrida entre os usuários não exagerem no seu evento.