如何Zend的\\分贝ZF2控制交易?(How does Zend\\Db in ZF2 contr

2019-07-05 00:16发布

的ZF1 Zend_Db的参考手册具有整个部分上执行交易。

该ZF2的Zend \ Db的参考手册,缺乏对交易的任何文件。

如何在ZF2进行交易? 示例代码将是有益的。

Answer 1:

丢失的文件是好奇。

要了解发生了什么,我不得不潜入API文档的Zend的\ DB \适配器。

它看起来像beginTransactionrollbackcommit定义在Zend的\ DB \适配器\驱动程序\ ConnectionInterface 。 这意味着,他们是每一个适配器连接上调用方法。 不幸的是,连接本身是相当埋葬。

我没有什么明确的 - 而在这个时候不能提供一个例子 - 是搞清楚哪个对象实际调用这些方法。 在最坏的情况下,它看起来像你可能想为$adapter->getDriver()->getConnection()->beginTransaction()

好恶。

我希望别人更多的知识,ZF2方便的拷贝,会看到这一点,并提供了一个更好的选择。

不要忘了,你可以出具BEGIN TRANSACTION / ROLLBACK / COMMIT / SET autocommit=... SQL语句自己。 这可能是正常的,因为它看起来并不像Zend的\ Db的跟踪交易状态。



Answer 2:

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

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


Answer 3:

有两种事情做交易。
1 - 的MyISAM是不是一个交易引擎,所以更改表引擎InnoDB的。
2 -交易查询( "START TRANSACTION;" OR "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 log.Those每个查询必须在所有事务查询相同。



文章来源: How does Zend\\Db in ZF2 control transactions?