2011-10-01 13 views
5

Usando Zend Framework, necesito (1) leer un registro de una base de datos MySQL, y (2) escribir de inmediato en ese registro para indicar que ha sido leído. No deseo que otros procesos o consultas puedan leer o escribir en el mismo registro entre los pasos (1) y (2).Transacciones de base de datos en Zend Framework: ¿Están aisladas?

Estaba considerando usar una transacción para estos pasos. Si utilizo los siguientes métodos, ¿cumplirá eso con mis requisitos?

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

Respuesta

10

Presuponiendo que está utilizando el InnoDB engine para las tablas que va a emitir transacciones sobre: ​​

Si el requisito es que primero hay que leer la fila y exclusivamente bloquearlo, antes de que se va a actualizar , debe emitir una consulta SELECT ... FOR UPDATE. Algo así como:

$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(); 
} 

o simplemente remitir SELECT ... FOR UPDATEUPDATE y sentencias SQL 'en bruto' en $db por supuesto.

+0

La actualización for es crítica. Tuve una situación similar implementando una cola. Gracias por el consejo. – cr125rider

Cuestiones relacionadas