Verrouillage de la table mysql avec php
Script 1.
$query_ = "lock tables test1 as test11 write";
mysql_query($query);
$query_ = "select * from test11";
sleep(20);
$query_ = "unlock tables";
mysql_query($query_);
Script 2.
$query_ = "select * from test1";
$result = mysql_query($query_);
Le problème est que si je lance second script lors de l'exécution de premier script. Tableau n'est pas verrouillé. Et je peux lire des données à partir d'elle.
J'ai besoin de verrouiller et de retour d'erreur.
Façon de faire ce travail?
- Il ne peut pas répondre à votre question, mais vous devez cesser d'utiliser
mysql_*
fonctions. Ils sont désapprouvées. Au lieu d'utiliser PDO (à partir de PHP 5.1) ou mysqli (à partir de PHP 4.1). Si vous ne savez pas lequel utiliser, lire cet article. - Je crois que la table ne seront verrouillés pour que notamment connexion mysql instance. Je pense que cela fonctionne de cette manière pour éviter des conditions de course.
- quel sens pour le verrouiller pour particulier de connexion mysql? Pourquoi mon script souhaitez insérer quelque chose quand je ne suis pas d'insérer quoi que ce soit?
- Peut-être que je me trompe à ce sujet. Peut-être que je suis confus, et ce à quoi je pensais était qu'en fait, il se verrouille automatiquement la table pendant l'exécution du script pour éviter des conditions de course...désolé, je ne suis pas beaucoup d'aide ici.
Vous devez vous connecter pour publier un commentaire.
Vous
read
de verrouillage de la table avec$query_ = "lock tables test1 as test11 read";
- ce qui signifie que d'autres requêtes pouvez toujours le lire sans aucun problème ce que-si-jamais (Pertinentes lien - faites défiler jusqu'à la section sur les types de verrou):D'infos sur le
read
type de serrure:Si vous voulez arrêter de rien d'autre tellement que reding, la table, vous devez utiliser un
write
de verrouillage comme suit:mysql_*
fonctions, je crois que la syntaxe estmysql_query("BEGIN");
(Vous pouvez aussi avoir besoin d'unautocommit=0
) et se termine avecmysql_query("commit");
- cela étant dit, si vous vous déplacez, PDO vous pouvez facilement faire des transactions à l'aide de beginTransactionSi vous ne voulez pas que d'autres pour accéder à la table puis utilisez
Autre script ne sera pas de retour d'erreur mais va attendre jusqu'à ce verrou est libéré.
Espère que ça aide...
Vous devez accorder les droits de verrouiller les tables de la db utilisateur.
Vous avez une fausse idée sur ce que les verrous de le faire. Serrures à ne pas empêcher les autres scripts d'accéder à des données, à la place des verrous incidence sur le calendrier de quand d'autres scripts pour accéder aux données. Lorsque le script 2 tente d'accéder ou de modifier les données qu'il n'est pas permis à cause d'une serrure, il va de pause et d'attente pour la libération du verrou. Après le script 1 déverrouille la table, script 2 va de l'avant et terminer sans aucun problème.