Kilitli tabloları PHP MySQLi zaman aşımı?

3 Cevap php

Ben mysqli zaman aşımı seçenekleri ile garip bir sorun var, buyrun:

Ben MYSQLI_OPT_CONNECT_TIMEOUT ayarlamak amacıyla) (mysqli_init () ve real_connect kullanıyorum

$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);
....

Sonra kilitli tablo üzerinde sorgu başlatarak am (LOCKE TABLO kullanıcılar YAZIN) ve onun sadece asılı, hatta bütün ayarları görmezden:

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) ve max_execution_time göz ardı edilir ama neden başka zaman aşımları ve özellikle MYSQLI_OPT_CONNECT_TIMEOUT ihmal ve nasıl çözmek için neden anlıyorum.

Windows ve Linux kutularında PHP 5.3.1 kullanıyorum, yardım lütfen.

3 Cevap

Orada innodb_lock_wait_timeout. Adından da anlaşılacağı gibi ama sadece InnoDB tablolar için.

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

Pascal Martin cevabı ek olarak:

PHP sorgu tamamlanana kadar uyuyor - böylece PHP için yapılandırılmış ettik bir şey göz ardı edilir. Sorgu hiç çıkmıyor, sonra PHP işleme uyanmak ve devam edecek - hangi o yürütme zamanı tükendi gerçekleştirmek ve aniden sona erecek işaret - o edindiği kilitleri yayınlayacak? Belki.

Bir çözüm, örneğin, kendi kilitleme şema uygulamak olacaktır

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

Ben bir neater çözüm masada bir tetikleyici olarak bu uygulamak olacaktır sanırım - ama benim MySQL PL / SQL biraz ropey.

C.