Mysql
 sql >> Base de données >  >> RDS >> Mysql

Opérations atomiques MySQL et verrouillage de table

Vous êtes très proche de votre design, mais pas tout à fait là.

Tout d'abord, votre table d'événements doit contenir le nombre de billets encore disponibles pour votre événement (en plus de tout ce que vous voulez).

Deuxièmement, votre table d'entiercement doit avoir une colonne DATETIME indiquant quand l'entiercement expire. Vous devez définir cette valeur chaque fois que les billets sont mis sous séquestre.

Troisièmement, la transaction consistant à mettre les billets sous séquestre doit

  1. verrouiller la ligne d'événement.
  2. lisez la colonne des billets disponibles. (abandonnez s'il n'y en a pas assez)
  3. insérer une ligne dans la table d'entiercement
  4. mettre à jour la ligne de l'événement pour décrémenter la colonne des tickets disponibles.
  5. déverrouiller la ligne d'événement.

Quatrièmement, l'action de finaliser la vente doit supprimer la ligne de dépôt fiduciaire et insérer une ligne de ticket vendu. Ce n'est pas difficile.

Cinquièmement, vous avez besoin d'une opération de nettoyage d'entiercement. Cela doit rechercher toutes les lignes d'entiercement qui ont expiré (qui ont une date d'expiration dans le passé) et, pour chacune :

  1. verrouiller la ligne d'événement correspondante.
  2. lire le nombre de tickets bloqués dans la table de blocage
  3. supprimer la ligne du tableau des tiers de confiance.
  4. mettez à jour la ligne de l'événement pour incrémenter la colonne des tickets disponibles.
  5. déverrouiller la ligne d'événement.

L'astuce est d'avoir le nombre de disponibles les billets sont maintenus de manière à ce qu'ils soient correctement verrouillés, de sorte que les conditions de concurrence entre les utilisateurs ne surchargent pas votre événement.