2011-10-01 17 views
5

使用Zend Framework,我需要(1)從MySQL數據庫讀取記錄,並(2)立即回寫該記錄以表明它已被讀取。我不希望其他進程或查詢能夠在步驟(1)和(2)之間讀取或寫入同一記錄。Zend Framework中的數據庫事務:它們是否被隔離?

我正在考慮使用這些步驟的交易。如果我使用以下方法,是否符合我的要求?

Zend_Db_Adapter_Abstract::beginTransaction() 
Zend_Db_Adapter_Abstract::commit() 
Zend_Db_Adapter_Abstract::rollBack() 

回答

10

預先假定你正在使用的InnoDB engine的表,你會發出關於交易:

如果要求是,你首先需要閱讀該行並獨佔鎖定,您要更新之前, ,你應該發出一個SELECT ... FOR UPDATE查詢。喜歡的東西:

$db->beginTransaction(); 
try 
{ 
    $select = $db->select() 
       ->forUpdate() // <-- here's the magic 
       ->from(
        array('a' => 'yourTable'), 
        array('your', 'column', 'names') 
       ) 
       ->where('someColumn = ?', $whatever); 

    $result = $this->_adapter->fetchRow($select); 

    /* 
     alter data in $result 
     and update if necessary: 
    */ 
    $db->update('yourTable', $result, array('someColumn = ?' => $whatever)); 

    $db->commit(); 
} 
catch(Exception $e) 
{ 
    $db->rollBack(); 
} 

或者乾脆出具當然$db '原始' SELECT ... FOR UPDATEUPDATE SQL語句。

+0

更新至關重要。我有類似的情況實施一個隊列。謝謝你的提示。 – cr125rider

相關問題