2010-10-25 16 views
4

Je voudrais savoir si ma table de verrouillage est nécessaire dans cette situation (j'utilise Coldfusion et MySQL):Devrais-je utiliser cflock ou non?

J'ai une table appelée wishlists(memberId, gameId, rank, updateAt) où les membres de stocker des jeux dans une liste personnelle.

wishlists a un homme-à-plusieurs avec une table members, et beaucoup-à-plusieurs avec une table games. Beaucoup de membres ont beaucoup de jeux stockés dans cette liste. Ces jeux sont classés en utilisant un champ int. Rangs sont notamment à un membre, donc:

Member 1 can have itemId=1, rank=1; itemId=2, rank=2 
Member 2 can have itemId=1, rank=1, itemId=2, rank=2 
etc... 

Chaque membre peut modifier sa liste en supprimant un élément, ou changer le rang d'un élément (sendGameToTopOfList(), deleteItemFromList(), par exemple) . Cela signifie qu'à chaque fois qu'une modification est apportée à une liste, la liste doit être classée à nouveau. J'ai écrit une fonction séparée appelée rankList() pour gérer le re-classement. Il est tiré après « deleteGameFromList() » ou "sendGameToTopOfList(), il effectue les opérations suivantes:

1. Gets a memberWishlist query of all records @memberId ordered first by **rank ASC**, then **updateAt ASC** fields 
2. Loops through memberWishlist query and sets each row's **rank=memberWishlist.RecordCount** 

champ updateAt est nécessaire parce que si un jeu a été déplacé vers le haut de la liste, nous aurions deux articles classé numéro 1, et de les différencier j'utilise updatedAt

Scénario Un:. Un membre a 100 jeux dans leur liste:

  1. Le membre déplace un élément vers le haut. rankList() est appelée une fois l'opération terminée.
  2. Alors que rankList() est à nouveau classement encore les éléments, membre supprime un jeu

Dans une demande de page normale cela est bien beau que la page ne sera pas recharger jusqu'à rankList() est fait. Mais si c'était ajax, ou si vous utilisiez cfthread, le membre peut supprimer 10 jeux en 5 secondes en cliquant très rapidement. Ensuite, la liste sera ré-classée après la suppression de toute façon, donc cela ne peut pas importer; mais il semble que c'est quelque chose que je dois protéger ...

Scénario 2: Certains de ces articles de cadeaux peuvent se transformer en commandes en utilisant un champ supplémentaire appelé « queuedForShipping. » Si queuedForShipping vaut 1, la fonction rankList() les ignore. Que se passe-t-il si un administrateur crée un envoi lorsqu'un membre supprime simplement un article ou en déplace un vers le haut?

Vos pensées sont appréciées.

Informations complémentaires: De nouveaux articles sont classés automatiquement au dernier insert

Répondre

2

n ° cflock ne va avoir aucun effet sur la façon dont les choses MySQL gère.

Cependant, vous pourriez vouloir une transaction. Envelopper vos opérations multiples dans un bloc de transaction indiquera à MySQL que vous voulez garantir que toutes les opérations se terminent avant de stocker les modifications de façon permanente.

Cela suppose que vos multiples requêtes sont générées dans les FC, comme ceci:

<cffunction sendToTopOfList()> 
    <cfquery> 
     send to top 
    </cfquery> 
    <cfquery> 
     resort everything 
    <cfquery> 
</cffunction> 

Si vous utilisez une procédure stockée sur le serveur db, alors (1) Je ne serais probablement pas trop préoccupé par la race conditions ici, car vous appliquerez probablement des verrous de ligne lorsque le serveur apporte des modifications, et (2) examinerez l'utilisation des transactions sur le serveur db si vous êtes toujours concerné.

Si vous avez encore des questions, je vais essayer d'y répondre, même si je ne suis pas vraiment un expert de MySQL et que je n'ai pas beaucoup utilisé ces dernières années.