繁体   English   中英

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

[英]How does Zend\Db in ZF2 control transactions?

ZF1 Zend_Db 参考手册有一整节是关于执行事务的。

ZF2 Zend\\Db 参考手册缺少任何关于事务的文档。

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

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

$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')

丢失的文档很奇怪。

为了找出发生了什么,我不得不深入研究 Zend\\Db\\Adapter 的API 文档

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

我不清楚——目前无法提供一个例子——是弄清楚你实际上在哪个对象上调用了这些方法。 在最坏的情况下,看起来您可能想要调用$adapter->getDriver()->getConnection()->beginTransaction()

呃。

我希望有更多知识的其他人以及手边的 ZF2 副本会看到这一点并提供更好的选择。

不要忘记,您可以自己发出BEGIN TRANSACTION / ROLLBACK / COMMIT / SET autocommit=... SQL 语句。 可能没问题,因为它看起来不像 Zend\\Db 跟踪事务状态。

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

此代码将无法正常工作

    $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 日志中的每个查询之前看到连接号。所有事务查询中的这些必须相同。

我在控制器中使用了beginTransactionrollbackcommit

我在不同模型上执行了许多事务,其中我使用预定义的函数而没有任何控制事务(单个 DB 事务不需要)。

使用$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();

希望对解决问题有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM