2012-04-18 83 views
4

當我有這樣一個循環:有沒有可能,INSERTS從PHP執行時(使用ZEND)延遲?

foreach(...) { 
    $r1 = $zend_db->fetchRow("SELECT ... "); 
    $zend_table->insert($data_array, $where); 
} 

...運行幾千次。是否有可能,$r1不包含在前一個循環中插入的記錄?

http://dev.mysql.com/doc/refman/5.1/en/query-cache.html他們寫道:「查詢緩存不會返回陳舊的數據。當表被修改時,查詢緩存中的任何相關條目都會被刷新。」但是,也許ZEND會爲SELECT或INSERT執行一些意想不到的緩存?

我是否需要使用事務來解決這個問題?

我有一個雙記錄的問題,沒有其他解釋他們來自哪裏。但我無法複製它,導致它在兩個月前發生,導入不再存在的csv數據。

+2

ZF不會做數據庫查詢的任何緩存,除非您使用Zend_Cache來自己緩存它。你在使用PDO MySQL嗎?我認爲'$ r1'不會包含前一個循環的記錄的唯一原因是,如果查詢失敗並且未處理,或者如果您插入到主服務器並從從服務器讀取且從服務器尚未已更新。 – drew010 2012-04-18 16:49:31

+0

還有點別的......看到我下面的評論。感謝您消除緩存的可能性! – johjoh 2012-04-19 10:16:23

回答

1

正如drew010在評論中所說的,Zend_Db沒有緩存,除非你自己實現它。下次要確定問題的原因是這樣的

try { 
      foreach(...) { 
     $r1 = $zend_db->fetchRow("SELECT ... "); 
     $zend_table->insert($data_array, $where); 
         } 
     } catch(Zend_Db_Exception $e) 
      { 

       $logger->log($e->getMessage(),Zend_Log::CRIT); //$logger is instance of Zend_Log 
      } 
+0

好的,謝謝你的澄清! INSERT沒有失敗,因爲記錄實際上存在......但是在下一個循環中插入了第二次(由於CSV中的重複條目),我認爲是因爲$ r1沒有結果。但是現在我意識到INSERT的條件並不安全。 – johjoh 2012-04-19 10:08:35