2011-10-01 4 views
5

젠드 프레임 워크를 사용하면 (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

관련 문제