2011-10-01 8 views
5

Zend Frameworkを使用して、私は(1)MySQLデータベースからレコードを読み込み、(2)直ちにそのレコードに書き戻してそれが読み込まれたことを示す必要があります。私は他のプロセスやクエリがステップ(1)と(2)の間で同じレコードを読み書きできるようにしたくありません。Zend Frameworkのデータベーストランザクション:それらは分離されていますか?

私はこれらのステップでトランザクションを使用することを検討していました。私が以下の方法を使用する場合、それは私の要件を満たすでしょうか?

あなたは上のトランザクションを発行しますテーブルに対して InnoDB engineを使用している前提
Zend_Db_Adapter_Abstract::beginTransaction() 
Zend_Db_Adapter_Abstract::commit() 
Zend_Db_Adapter_Abstract::rollBack() 

答えて

10

:あなたはそれを更新しようとしている前の要件は、あなたが最初の行を読んで、排他的にそれをロックする必要があるということであれば

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

for the updateは重要です。同様の状況でキューを実装しました。先端に感謝します。 – cr125rider

関連する問題