Maison  >  Questions et réponses  >  le corps du texte

Empêcher MySQL de lire lors de la mise à jour

J'ai deux requêtes simples, une pour lire le tableau et une pour mettre à jour le tableau. Comment verrouiller la lecture d'une requête de sélection pendant l'exécution de la requête de mise à jour. Maintenant, dans MySQL InnoDB, j'ai remarqué que les écritures/mises à jour sont verrouillées par défaut, mais les lectures/sélections récupèrent les anciennes données avant la transaction.

J'ai essayé d'utiliser une transaction dans la requête de mise à jour, puis SELECT ... FOR UPDATE - en dehors de la transaction - mais cela n'a pas semblé réussir. De plus, à des fins de test, j'aimerais savoir comment ralentir les requêtes UPDATE. Je suis tombé sur SLEEP(X) mais je ne sais pas comment l'implémenter dans la requête de mise à jour.

Comment faire en sorte que chaque requête attende la lecture/écriture jusqu'à ce que l'écriture soit terminée.

P粉190883225P粉190883225367 Il y a quelques jours600

répondre à tous(1)je répondrai

  • P粉877114798

    P粉8771147982023-11-08 11:37:07

    L'utilisation de READ-COMMITTED事务将查看最新提交的事务。更改,并使用SELECT ... LOCK IN SHARE MODE entraînera le blocage des lectures jusqu'à ce que toutes les mises à jour en attente soient validées.

    Essayez ceci. Sur un seul écran, démarrez les transactions et les mises à jour. Aucun SLEEP() n'est requis, la transaction n'est tout simplement pas validée. Le verrou créé par UPDATE continuera d'exister jusqu'à votre validation.

    BEGIN;
    UPDATE MyTable SET something = '1234' WHERE id = 3;

    Ne soumettez pas encore.

    Pendant ce temps, dans le deuxième écran, définissez l'isolation des transactions pour lire et valider les transactions. Il n'est pas nécessaire de démarrer une transaction explicite car les requêtes InnoDB utilisent des transactions même si elles sont automatiquement validées.

    SET tx_isolation='READ-COMMITTED';
    
    SELECT * FROM MyTable WHERE id = 3 LOCK IN SHARE MODE;
    <hangs>

    Le verrouillage en mode partagé fait attendre car il reste un verrou exclusif en suspens créé par la mise à jour.

    Dans le premier écran :

    COMMIT;

    Dans le deuxième écran, voilà ! La lecture bloquante se débloquera et vous pourrez voir les résultats de l'UDPATE immédiatement sans vider la transaction.

    répondre
    0
  • Annulerrépondre