Question

Voici mon ordre de transaction souhaité:

  1. User1 champ de sélection, effectuer l'opération, mise à jour avec la nouvelle valeur.
  2. Utilisateur2 champ de sélection, effectuer l'opération, mise à jour avec la nouvelle valeur.
  3. User3 champ de sélection, effectuer l'opération, mise à jour avec la nouvelle valeur.

D'après ce que je comprendre la sélectionner d'abord effectuer seulement un verrouillage en écriture tandis que la seconde effectuer lire et écrire serrure.

Les deux semble utile, mais dans le premier cas, quelle valeur sera Utilisateur2 lire? La valeur initiale avant les mises à jour User1 ou la valeur après les mises à jour User1 (qui est ce que je veux)?

Je suis confus, dois-je utiliser SELECT ... FOR UPDATE ou SELECT ... LOCK IN SHARE MODE?

Était-ce utile?

La solution

Vous voulez probablement utiliser FOR UPDATE.

Avec « LOCK IN SHARE MODE » le deuxième utilisateur sera toujours en mesure de lire la valeur avant qu'il a été mis à jour.

A partir de la documentation MySQL:

  

Si vous utilisez FOR UPDATE avec un stockage   moteur qui utilise des verrous de page ou de ligne,   lignes examinées par la requête sont   écriture verrouillée jusqu'à la fin de la   transaction en cours. En utilisant LOCK IN   SHARE MODE définit un verrou partagé   permet à d'autres transactions à lire la   les lignes examinées, mais pas mettre à jour ou   les supprimer.

Ainsi, même si LOCK IN SHARE MODE empêche une mise à jour, si vous le fonctionnement dépend de la valeur de lecture, vous pouvez vous retrouver dans un état incohérent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top