Empêcher MySQL de lire lors de la mise à jour
P粉190883225
P粉190883225 2023-11-07 18:05:53
0
1
440

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, puisSELECT ... 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粉190883225
P粉190883225

répondre à tous (1)
P粉877114798

L'utilisation deREAD-COMMITTED事务将查看最新提交的事务。更改,并使用SELECT ... LOCK IN SHARE MODEentraî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; 

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.

    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!