2011-10-01 94 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