2010-03-23 11 views
1

J'ai un problème bizarre avec des options de délai d'attente mysqli, ici vous allez:PHP MySQLi timeout sur les tables verrouillées?

J'utilise mysqli_init() et real_connect() afin de mettre MYSQLI_OPT_CONNECT_TIMEOUT

$this->__mysqli = mysqli_init(); 
if(!$this->__mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT,1)) 
    throw new Exception('Timeout settings failed') 

$this->__mysqli->real_connect(host,user,pass,db); 
.... 

Alors j'entreprends requête sur la table verrouillée (LOCKE utilisateurs TABLE ÉCRIRE) et son juste accroché, en ignorant tous mes paramètres même:

set_time_limit(1); 
ini_set('max_execution_time',1); 
ini_set('default_socket_timeout',1); 
ini_set('mysql.connect_timeout',1); 

Je comprends pourquoi set_time_limit (1) et max_execution_time est ignoré, mais pourquoi d'autres délais d'attente et surtout MYSQLI_OPT_CONN ECT_TIMEOUT sont ignorés et comment le résoudre. J'utilise PHP 5.3.1 sous Windows et Linux, merci de nous aider.

Répondre

0

MYSQLI_OPT_CONNECT_TIMEOUT semble configurer le délai d'attente à l'heure de connexion:

connection timeout in seconds (supported on Windows with TCP/IP since PHP 5.3.1)


Ici, vous essayez d'exécuter une requête sur une table verrouillée ... Ce qui signifie que vous avez une question qui prend beaucoup de temps (comme pour toujours); mais vous êtes déjà connecté à la base de données. Par conséquent, ce qui doit être configuré n'est pas le connexion timeout; mais certains "requête timeout".


Je ne sais pas comment définir que « délai de requête », bien que ...

le drapeau MYSQLI_CLIENT_INTERACTIVE pour mysql_real_connect pourrait peut-être aider, d'une manière ou d'une autre?

+0

sans succès :-(d'autres idées? – Marcin

+0

MYSQLI_CLIENT_INTERACTIVE est un délai d'inactivité sur l'inactivité de la requête. Il n'est pas un délai d'attente de la requête. – dAm2K

0

Il y a innodb_lock_wait_timeout. Mais comme son nom l'indique, c'est uniquement pour les tables InnoDB.

The timeout in seconds an InnoDB transaction may wait for a row lock before giving up. The default value is 50 seconds. A transaction that tries to access a row that is locked by another InnoDB transaction will hang for at most this many seconds before issuing the following error: ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
+0

je besoin fot MyISAM Je suis affraid, mais merci. – Marcin

0

En plus de la réponse de Pascal MARTIN:

PHP dort jusqu'à ce que la requête est terminée - donc tout ce que vous avez configuré pour PHP est ignoré. Si la requête retourne un jour, alors PHP se réveillera et continuera le traitement - à quel point il se rendra compte qu'il a épuisé le temps d'exécution et se terminera brusquement - relâchera-t-il les verrous qu'il a acquis? Peut être.

Une solution consisterait à implémenter votre propre schéma de verrouillage, par ex.

$qry="UPDATE mydb.mylocks SET user='$pid' WHERE tablename='$table_to_lock' AND user IS NULL"; 
$basetime=time(); 
$nottimedout=5; 
do { 
    mysql_query($qry); 
    $locked=mysql_affected_rows(); 
    if (!$locked && $nottimedout--) sleep(1); 
} while (!$locked && $nottimedout); 
if ($nottimedout) { 
    // do stuff here 
} 
mysql_qry("UPDATE mydb.mylocks SET user=NULL WHERE tablename='$table_to_lock' AND user='$pid'"; 

je suppose une solution plus propre serait de mettre en œuvre cela comme un déclencheur sur la table - mais mon MySQL PL/SQL est un peu mauvaise qualité.

C.

+0

le problème avec ce verrou est que son verrou mysql interne et je n'ai aucun contrôle dessus ... – Marcin