【问题标题】:Database transactions in Zend Framework: Are they isolated?Zend Framework 中的数据库事务:它们是隔离的吗?
【发布时间】:2011-10-01 05:03:47
【问题描述】:

使用 Zend 框架,我需要 (1) 从 MySQL 数据库中读取一条记录,并且 (2) 立即写回该记录以表明它已被读取。我不希望其他进程或查询能够在步骤 (1) 和 (2) 之间读取或写入同一记录。

我正在考虑在这些步骤中使用事务。如果我使用以下方法,是否可以满足我的要求?

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

【问题讨论】:

    标签: php mysql database zend-framework transactionscope


    【解决方案1】:

    假设您将 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 语句。

    【讨论】:

    • for 更新很关键。我在实现队列时遇到了类似的情况。感谢您的提示。
    • 看起来与 Zend 框架 v.3 中使用的结构非常相似:beginTransaction()、commit()、rollback() 函数。
    猜你喜欢
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多