Le problème est que vous essayez d'utiliser le verrouillage de niveau MySQL pour vous assurer qu'un ticket ne peut pas être attribué à plus d'une personne. De cette façon, il n'y a aucun moyen de détecter si un ticket est verrouillé par un utilisateur.
J'implémenterais un verrou au niveau de l'application en ajoutant 2 champs liés au verrou à la table des tickets :un horodatage lorsque le verrou a été appliqué et un champ d'ID utilisateur vous indiquant quel utilisateur détient le verrou. Les champs liés au verrou peuvent être contenus dans une autre table (le panier d'achat, par exemple, peut être utilisé à cette fin).
Lorsqu'un utilisateur sélectionne un ticket, vous essayez de mettre à jour ces champs de verrouillage avec une instruction de mise à jour conditionnelle :
update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null
Valeurs à la place de ...
sont fournis par votre application. lock_time is null
Le critère est là pour s'assurer que si le ticket a déjà été sélectionné par un autre utilisateur, le dernier utilisateur n'outrepasse pas le verrou. Après l'instruction de mise à jour, vérifiez le nombre de lignes affectées. Si c'est le cas, l'utilisateur actuel a acquis le verrou. Si c'est 0, alors quelqu'un d'autre a verrouillé le ticket.
Si vous avez les données de verrouillage dans une autre table, placez une restriction unique sur le champ d'identification du ticket dans cette table et utilisez insert pour acquérir un verrou. Si l'insertion réussit, le verrou est acquis. En cas d'échec, un autre utilisateur a verrouillé le ticket.
Le verrou est généralement maintenu pendant un certain nombre de minutes, après quoi votre application doit libérer le verrou (définissez les champs de verrouillage sur null ou supprimez l'enregistrement de verrouillage de l'autre table).