2012-04-21 40 views
2

作爲一個例子,用這個腳本;當php代碼沒有達到release-mysql-lock階段時會發生什麼?

mysql_query("LOCK TABLES mytest WRITE;"); 

for ($i = 1; $i < 100000; ++$i) { 
    mysql_query("INSERT INTO mytest (Value, Value2, Value3) VALUES ($i, $i, $i);"); 
} 

mysql_query("UNLOCK TABLES;"); 

如果腳本超時會發生什麼/用戶電腦死機/不管之前達到UNLOCK TABLES階段?請問mysql會「通知」請求鎖的客戶端是否已斷開連接並正確釋放鎖,否則會被無限制地卡住?

+0

想到的第一個問題是你的sql引擎支持鎖定,首先? ..和「無限」? – Blake 2012-04-21 19:05:44

+1

您可能想要使用'ignore_user_abort(true);'來確保您的腳本完成,而不管用戶是否因其他原因而中止請求或斷開連接。 – ThiefMaster 2012-04-21 19:08:25

+0

@Blake [無窮](http://dictionary.reverso.net/english-definition/infinitively)有什麼問題?是的,它支持鎖定。 – natli 2012-04-21 19:08:58

回答

7

按照MySQL文檔:

如果客戶端的會話的連接終止,是否正常或異常 ,服務器隱式釋放該 會話(事務性和非)持有的所有表鎖。如果客戶端 重新連接,鎖定將不再有效。

+0

+1誰知道它花了11.7k代表學習如何谷歌「MySQL表鎖」,並閱讀 – 2012-04-21 19:09:13

+0

@PhpMyCoder真棒挖苦,我沒有谷歌,但一個更具體的短語。 – natli 2012-04-21 19:09:49

+0

其實它是「mysql鎖表」。 :) – 2012-04-21 19:09:58

相關問題