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)
Cha*_*les 23
丢失的文件很好奇.
要了解发生了什么,我不得不深入研究Zend\Db\Adapter 的API文档.
它看起来像beginTransaction,rollback并commit在定义的Zend\DB \适配器\驱动程序\ ConnectionInterface.这意味着它们是在每个适配器连接上都可调用的方法.不幸的是,连接本身就被埋没了.
我不清楚的是 - 目前还不能提供一个例子 - 是找出你实际上称之为这些方法的对象.在最坏的情况下,看起来你可能想打电话$adapter->getDriver()->getConnection()->beginTransaction().
好恶.
我希望有更多知识的人和ZF2的副本会看到这个并提供更好的选择.
不要忘记您可以自己发出BEGIN TRANSACTION/ ROLLBACK/ COMMIT/ SET autocommit=...SQL语句.这可能没问题,因为它看起来不像Zend\Db跟踪事务状态.
做交易有两个问题.
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日志中的每个查询之前看到连接号.在所有事务查询中必须相同.