O problema é que você está tentando usar o bloqueio de nível do MySQL para garantir que um ticket não possa ser atribuído a mais de uma pessoa. Dessa forma, não há como detectar se um ticket está bloqueado por um usuário.
Eu implementaria um bloqueio no nível do aplicativo adicionando 2 campos relacionados ao bloqueio à tabela de tickets:um carimbo de data e hora quando o bloqueio foi aplicado e um campo de ID do usuário informando qual usuário mantém o bloqueio. Os campos relacionados ao bloqueio podem ser mantidos em outra tabela (carrinho de compras, por exemplo, pode ser usado para esse fim).
Quando um usuário seleciona um ticket, você tenta atualizar esses campos de bloqueio com uma instrução de atualização condicional:
update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null
Valores no lugar de
...
são fornecidos pelo seu aplicativo. lock_time is null
Existem critérios para garantir que, se o ticket já tiver sido selecionado por outro usuário, o usuário posterior não substituirá o bloqueio. Após a instrução de atualização, verifique o número de linhas afetadas. Se for um, o usuário atual adquiriu o bloqueio. Se for 0, então outra pessoa bloqueou o ticket. Se você tiver os dados de bloqueio em outra tabela, coloque uma restrição exclusiva no campo de ID do ticket nessa tabela e use insert para adquirir um bloqueio. Se a inserção for bem-sucedida, o bloqueio será adquirido. Se falhar, outro usuário bloqueou o ticket.
O bloqueio geralmente é mantido por alguns minutos, depois disso seu aplicativo deve liberar o bloqueio (definir campos de bloqueio como nulos ou excluir o registro de bloqueio da outra tabela).