script 1. script 2. p> Le problème est que si j'exécute un second script lors de l'exécution du premier script. La table J'en ai besoin d'être verrouillé et renvoyer une erreur. P> Comment faire ce travail? P> P>
4 Réponses :
Vous êtes info sur le type code> Type de verrouillage: p> Si vous souhaitez arrêter tout ce que em> d'autre que vous devez enregistrer la table, vous devez utiliser un verrouillage lue code> verrouillage de la table avec
$ query_ = "Tables de verrouillage Test1 comme test11 lis"; code> - ce qui signifie que d'autres questions peuvent toujours la lire sans aucun problème. -so-jamais (pertinent Lien - Faites défiler jusqu'à La section sur les types de verrouillage):
écrire code> comme suit: p> < Pré> xxx pré> p>
Je change de modificateur en "Write" Second Script Retourne tous les enregistrements.
Vérifiez mon exemple que j'ai changé pour écrire. Toujours le même. Lit tout va bien. Essayez vous-même, vous verrez cela ne fonctionne pas.
La session est spécifique à la session. La session est-elle une question arbitraire (qui est cool) ou essayez-vous d'émuler une transaction sur les tables que vous verrouillez-vous?
Je ne te comprends pas de question. Mais j'ai essayé de faire toutes les questions dans une transaction pour un script et sans transaction. Toujours ne fonctionne pas. $ Query_ = "Démarrer la transaction"; mysql_query ($ Query_); $ Query_ = "Tables de verrouillage Test1 comme test11 écrire"; mysql_query ($ requis); $ Query_ = "Sélectionnez * de Test11"; Dormir (20); $ Query_ = "Tables de déverrouillage"; mysql_query ($ Query_); mysql_query ("commit");
Ceci est exemple de question. J'essaie de voir que les tables sont verrouillées. Et d'autres scripts ne peuvent pas accéder aux données. Mais je ne peux pas le faire travailler.
@ douleur.reign Si vous souhaitez utiliser des transactions avec MySQL _ * CODE> Fonctions, je pense que la syntaxe est
mysql_query ("commencements"); code> (vous avez peut-être également besoin d'un
autocommet = 0 code>) et se termine par
mysql_query ("commit"); code> - ayant dit cela, si vous vous déplacez vers
Essayé mysql_query ("commencez") et définissez Autocommit = 0 et restreint. Toujours ne se verrouille pas.
Rien n'aide. PDO avec transaction et sans transaction ne se verrouille pas aussi.
La façon dont cette réponse est libellée est déroutante. Dites-vous que la seule chose qu'une serrure de lecture est d'empêcher la session en cours d'écrire à cette table? Donc, d'autres sessions peuvent toujours lire ou écrire à cette table? En outre, dans ce contexte, quelle est exactement une "session"?
@ still_dreaming_1 Un verrou de lecture empêchera toute session d'écrire sur la table pendant que la serrure est en place - bien que d'autres sessions puissent également récupérer une serrure de lecture en même temps. Une session est maintenue en place à partir du moment où l'application d'exécution est une connexion au temps que la connexion est terminée (dans le code ou lorsque le code termine l'exécution).
Si vous ne voulez pas que les autres accédent à cette table, utilisez
LOCK TABLES test1 WRITE;
Je l'ai essayé. Toujours ne verrouille rien. Le deuxième script peut facilement accéder aux données.
Il semble que de votre premier script, vous mettez d'abord le verrouillage de l'écriture sur Test1, puis vous exécutez une requête, puis dormant pendant 20 secondes, puis déverrouillez la table. Demunper vous déverrouillez, le second script attend que la table déverrouille. Dès que la table déverrouille, la requête dans le deuxième script a accès à la table et renvoie des données. Essayez d'augmenter le temps de sommeil à 100 ou dire 200, puis vérifiez les résultats.
Vous devez accorder les droits des tables de verrouillage à l'utilisateur de la DB. P>
Vous avez une idée fausse sur ce que font les serrures. Les serrures pour ne pas empêcher d'autres scripts d'accéder à des données, les verrous affectent la synchronisation du moment où d'autres scripts accéderont aux données. Lorsque le script 2 essaie d'accéder ou de modifier des données qu'il n'est pas autorisée à cause d'un verrou, il pause et attendra que le verrou soit libéré. Une fois le script 1 déverrouille la table, le script 2 procédera et remplira sans aucun problème. P>
Cela peut ne pas aider à répondre à votre question, mais vous devez cesser d'utiliser les fonctions
MYSQL _ * CODE>. Ils sont obsolètes. Utilisez plutôt PDO (prise en charge à partir de PHP 5.1) ou mysqli (prise en charge à partir de PHP 4.1). Si vous n'êtes pas sûr de savoir lequel utiliser, Lire cet article .
Je crois que la table ne sera verrouillée que pour cette instance de connexion MySQL particulière. Je pense que cela fonctionne de cette façon d'empêcher les conditions de race.
Quel sens pour le verrouiller pour une connexion MySQL particulière? Pourquoi mon script voudrait-il insérer quelque chose quand je n'entraînerai rien?
Peut-être que je me trompe à ce sujet. Peut-être que je suis confus, et ce que je pensais être que cela verrouille automatiquement la table lors de l'exécution de script pour empêcher les conditions de course ... Désolé, je ne suis pas beaucoup d'aide ici.