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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZF2中的Zend Db如何控制事务?相关的知识,希望对你有一定的参考价值。

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

ZF2 ZendDb reference manual缺少任何交易记录。

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

答案

缺少的文档很好奇。

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

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

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

Eww。

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

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

另一答案

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

$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')
另一答案

进行交易有两个问题。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日志中的每个查询之前看到连接号。所有事务查询中的连接号必须相同。

另一答案

我在控制器中使用了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();

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

以上是关于ZF2中的Zend Db如何控制事务?的主要内容,如果未能解决你的问题,请参考以下文章

ZF2 / PHPUnit:模拟 Zend/Db/Adapter/Adapter 以供进一步使用

ZF2 - 使用 Ajax 填充选择

Zend 2中两个表的并集

Zend/ZF2/TableGateway mysql_insert_id 替换?

ZF2 将 BjyAuthorize 与 Zend\Navigation 集成

Zend框架2动作助手?