2010-03-23 66 views
1

我有mysqli的超时选项一个奇怪的问题,在这里你去:锁定表上的PHP MySQLi超时?

我为了设置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); 
.... 

使用mysqli_init()和real_connect()然后我就锁定表开始查询(洛克表用户写)和它只是挂,竟然不顾我的所有设置:

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

我明白为什么的set_time_limit(1)的max_execution_time被忽略,但为什么其他超时和特别MYSQLI_OPT_CONN ECT_TIMEOUT被忽略,以及如何解决它。

我在Windows和Linux机器上使用PHP 5.3.1,请大家帮忙。

回答

0

MYSQLI_OPT_CONNECT_TIMEOUT似乎在连接时配置超时时间:

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


在这里,你正试图在锁定的表执行查询...这意味着你有一个查询,需要很多的时间(像永远);但是您已连接到数据库

所以,应该配置什么不是连接超时;但一些“查询超时”。


不知道如何设置“查询超时”,但...

也许MYSQLI_CLIENT_INTERACTIVE标志mysql_real_connect可以帮助,以这种或那种方式?

+0

没有成功:-(任何其他的想法? – Marcin 2010-03-23 12:27:47

+0

MYSQLI_CLIENT_INTERACTIVE是查询活动一个空闲超时。这不是一个查询超时。 – dAm2K 2012-03-08 12:59:46

0

innodb_lock_wait_timeout。但顾名思义,它只适用于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

我需要它FOT的MyISAM我affraid,但感谢。 – Marcin 2010-03-23 13:54:26

0

除了帕斯卡尔·马丁的答案:

PHP正在睡觉,直到查询完成 - 所以,只要你已经配置PHP被忽略。如果查询以往任何时候都不会返回,那么PHP将被唤醒并继续处理 - 此时它会意识到它已经用完了执行时间和突然结束 - 这将释放它已经收购了锁?也许。

一个解决办法是实现自己的锁定模式,例如

$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'"; 

我想了一个更简洁的解决方案是实现这个作为餐桌上的扳机 - 但我的MySQL PL/SQL是有点举步维艰。

C.

+0

问题与此锁是它的内部MySQL锁,我没有控制它... – Marcin 2010-03-23 13:53:54