ZF2中Zend\Db如何控制交易?

Gre*_*bes 18 php mysql transactions zend-db zend-framework2

ZF1 Zend_Db参考手册有关于执行事务的整个部分.

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

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

Die*_*uzi 40

你有它.Begin,Commit和Rollback Transactions的正确方法如下:

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

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

$this->getAdapter()->getDriver()->getConnection()->rollback();
Run Code Online (Sandbox Code Playgroud)

只是为了把它放在那里你也可以得到创建的姓氏:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue()
Run Code Online (Sandbox Code Playgroud)

如果您使用的是pgSQL,则需要添加序列以返回创建的Last ID:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq')
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@Diemuzi - 这真的很有用. (2认同)

Cha*_*les 23

丢失的文件很好奇.

要了解发生了什么,我不得不深入研究Zend\Db\Adapter 的API文档.

它看起来像beginTransaction,rollbackcommit在定义的Zend\DB \适配器\驱动程序\ ConnectionInterface.这意味着它们是在每个适配器连接上都可调用的方法.不幸的是,连接本身就被埋没了.

我不清楚的是 - 目前还不能提供一个例子 - 是找出你实际上称之为这些方法的对象.在最坏的情况下,看起来你可能想打电话$adapter->getDriver()->getConnection()->beginTransaction().

好恶.

我希望有更多知识的人和ZF2的副本会看到这个并提供更好的选择.

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


Mo *_*ami 8

做交易有两个问题.
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();   
Run Code Online (Sandbox Code Playgroud)

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

请改用以下代码:

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

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