ZF2中的Zend \ Db如何控制事务?

问题描述 投票:18回答:4

ZF1 Zend_Db参考手册具有执行交易的entire section

ZF2 Zend\Db reference manual缺少任何交易记录。

如何在ZF2中执行交易?示例代码会有所帮助。

php mysql transactions zend-framework2 zend-db
4个回答
23
投票

缺少的文档很好奇。

要了解发生了什么,我必须深入研究Zend \ Db \ Adapter的API docs

看起来beginTransaction中定义了rollbackcommitZend\Db\Adapter\Driver\ConnectionInterface。这意味着它们是在每个适配器连接上均可调用的方法。不幸的是,连接本身被掩埋了。

我尚不清楚的内容-目前无法提供示例-正在弄清楚您实际上在哪个对象上调用了这些方法。在最坏的情况下,您似乎可能要呼叫$adapter->getDriver()->getConnection()->beginTransaction()

Eww。

我希望其他人能有更多的知识,并且可以得到ZF2的副本,这将为您提供更好的选择。

[不要忘记,您可以自己发布BEGIN TRANSACTION /ROLLBACK/COMMIT/SET autocommit=...SQL语句。 可能确定,因为看起来Zend \ Db不会跟踪事务状态。


40
投票

你知道了。开始,提交和回滚事务的正确方法如下:

$this->getAdapter()->getDriver()->getConnection()->beginTransaction();

$this->getAdapter()->getDriver()->getConnection()->commit();

$this->getAdapter()->getDriver()->getConnection()->rollback();

只需将其放到那里,您还可以获取创建者的最后一个ID:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue()

如果使用的是pgSQL,则需要添加序列以返回创建的最后一个ID:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq')

8
投票

进行交易有两个问题。1-MyISAM不是事务引擎,因此将表引擎更改为InnoDB。2-事务查询("START TRANSACTION;""ROLLBACK;")连接必须与其他查询(插入或更新)相同。为此,您应该在ZF2中获取当前的数据库适配器,并在所有查询中使用它。

此代码将不起作用正确:

    $this->getAdapter()->getDriver()->getConnection()->beginTransaction();  
    //do some jobs - e.g : multiple tables update or insert.  
    $this->getAdapter()->getDriver()->getConnection()->rollback();   

因为$this->getAdapter()->getDriver()->getConnection()创建新的数据库连接。

使用以下代码代替:

    $connection = $this->getAdapter()->getDriver()->getConnection();
    $connection->beginTransaction();
    //do some jobs - e.g : multiple tables update or insert. 
    $connection->rollback();

为了检查您的连接是否正确,只需在mysql中启用查询日志即可。运行查询后,您将在mysql日志中的每个查询之前看到连接号。所有事务查询中的连接号必须相同。


0
投票

我在控制器中使用了beginTransactionrollbackcommit

我在不使用任何控制事务的情况下使用预定义功能在不同模型上执行了许多事务(对于单个数据库事务而言不是必需的。

使用$this->getAdapter()->getDriver()->getConnection()->beginTransaction();undefined getAdapter()方法上给出错误。

所以我执行以下方式,

  //begain tarnsaction
                $db = Zend_Db_Table_Abstract::getDefaultAdapter();

                $db->beginTransaction();

//rollback

                $db->rollback();

//commit db changes

                $db->commit();

希望对解决问题可能有用。

© www.soinside.com 2019 - 2024. All rights reserved.