Используя Zend Framework, мне нужно (1) прочитать запись из базы данных MySQL и (2) немедленно записать обратно в эту запись, чтобы указать, что она была прочитана. Я не хочу, чтобы другие процессы или запросы могли читать или записывать одну и ту же запись между шагами (1) и (2).
Я рассматривал возможность использования транзакции для этих шагов. Если я использую следующие методы, это выполнит мои требования?
Zend_Db_Adapter_Abstract::beginTransaction() Zend_Db_Adapter_Abstract::commit() Zend_Db_Adapter_Abstract::rollBack()
Предполагая, что вы используете движок InnoDB для таблиц, по которым вы будете отправлять транзакции:
Если требование состоит в том, что вам сначала нужно прочитать строку и заблокировать ее, прежде чем вы собираетесь ее обновлять, вам следует выдать запрос 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(); }
Или просто выведите «raw» SELECT ... FOR UPDATE
и UPDATE
SQL-инструкции на $db
конечно.