PHP的query timeout對於lock中的tbale是否有效

之前有介紹過如何設定 sybase 的 lock timeout,將FreeTDS更新到0.91後,順便測試當資料庫發生鎖定時,query timeout是否能夠強制程式中斷,程式不會因此卡住?依舊同時測試MS SQL、及Sybase。

測試的假設狀況為…刻意將測試用table產生lock,同時以php程式去查詢已經被lock的table,該主機上使用FreeTDS 0.91,並且設定了query timeout為五秒(請參考php存取mssql、sybase時,如何設定query timeout)。

測試的結果…FreeTDS果然對於這兩家資料庫的處理不同…
  • MS SQL:查詢超過五秒後,查詢被中斷,控制權回到程式(不需設定lock timeout)
  • Sybase:查詢超過五秒後,程式依舊卡住。(除非將lock的table解除lock,或設定lock timeout。控制權才會回到程式)
當然,FreeTDS對於MS SQL的處理行為,是比較符合預期的…

在測試過程中,無意間發現一個現象…當程式以FreeTDS 0.61存取Sybase(MS SQL無此問題),型態為char、varchar的欄位時,如果欄位長度超過255以上,查詢時會有錯誤訊息。查詢結果,在超過255以上的字元會被截掉。

以下面php程式為例。(注意,下面的範例中,查詢語法根本沒有實際到資料庫中撈取資料,依舊會有問題)
  1. $sql = "select '01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789' as test1";      
  2. $query = sybase_query($sql);  
  3. var_dump(sybase_fetch_assoc($query));  
查詢結果,超過255以上的字元會被截掉…
  1. array(1) {  
  2.   ["test1"]=>  
  3.   string(255) "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234"  
  4. }  
錯誤訊息如下…
Warning: sybase_query(): Sybase: Server message: Character or binary data returned from Adaptive Server has been truncated. The client application does not support more than 255 bytes of data as a result column or output parameter.

當使用FreeTDS 0.91,就不會有此問題了…完整呈現超過255以上的字元
  1. array(1) {  
  2.   ["test1"]=>  
  3.   string(260) "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"  
  4. }  

留言