2009-10-20 34 views

回答

7

我沒有看到實際的Zend DB方法鎖定表,但也許只是這樣做:

//Lock Table 
$sql = "LOCK TABLE page WRITE"; 
$db->fetchRow($sql); 

//Get your data 
$sql = "SELECT * FROM page WHERE col='value'"; 
$result = $db->fetchAll($sql); 

//Make the insert 
$data = array('col1' => 'val1', 'col2' => 'val2'); 
$db->insert('page', $data); 

//Unlock tables 
$sql = "UNLOCK TABLES"; 
$db->fetchRow($sql); 

可能不是最好的解決方案,這是未經測試。但它可能適用於你。

更新:我遇到了更好的解決方案。使用transactions

// Start a transaction explicitly. 
$db->beginTransaction(); 

try { 
    //Get your data 
    $sql = "SELECT * FROM page WHERE col='value'"; 
    $result = $db->fetchAll($sql); 
    //Make the insert 
    $data = array('col1' => 'val1', 'col2' => 'val2'); 
    $db->insert('page', $data); 

    // If all succeed, commit the transaction and all changes 
    // are committed at once. 
    $db->commit(); 

} catch (Exception $e) { 
    // If any of the queries failed and threw an exception, 
    // we want to roll back the whole transaction, reversing 
    // changes made in the transaction, even those that succeeded. 
    // Thus all changes are committed together, or none are. 
    $db->rollBack(); 
    echo $e->getMessage(); 
} 

我最近遇到了同樣的問題,並且事務處理效果很好。絕對要走的路。

+0

我想我必須這樣做..謝謝你的迴應。 – deepanshuyadav 2009-10-27 11:28:55

0

我想你會需要使用一個適配器,但我不確定鎖定工程雖然。

$ model-> getAdapter() - > query($ sql,$ bind);

1

$ this - > _ db-> getConnection() - > exec('LOCK TABLES page');

+0

如果您使用「mysqli」作爲存儲引擎,這將不起作用:「調用未定義的方法mysqli :: exec()」 – Select0r 2013-03-15 10:26:56

相關問題