ZF1 Zend_Db 参考手册有一整节关于执行事务。
ZF2 Zend\Db 参考手册缺少关于事务的任何文档。
如何在 ZF2 中执行交易?示例代码会有所帮助。
你明白了。开始、提交和回滚事务的正确方法如下:
$this->getAdapter()->getDriver()->getConnection()->beginTransaction();
$this->getAdapter()->getDriver()->getConnection()->commit();
$this->getAdapter()->getDriver()->getConnection()->rollback();
只是为了把它放在那里,您还可以获得由以下人员创建的 Last ID:
$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue()
如果您使用 pgSQL,则需要添加序列以返回创建的 Last ID:
$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq')
缺少的文档很奇怪。
为了弄清楚发生了什么,我不得不深入研究 Zend\Db\Adapter 的API 文档。
它看起来像beginTransaction
,rollback
并且commit
在Zend\Db\Adapter\Driver\ConnectionInterface中定义。这意味着它们是可在每个适配器连接上调用的方法。不幸的是,连接本身被埋没了。
我不清楚——目前也无法提供一个例子——是弄清楚你实际上调用了哪个对象上的这些方法。在最坏的情况下,您可能想要调用$adapter->getDriver()->getConnection()->beginTransaction()
.
哇。
我希望其他有更多知识的人,以及方便的 ZF2 副本,会看到这一点并提供更好的选择。
不要忘记您可以自己发出BEGIN TRANSACTION
// SQL语句ROLLBACK
。这可能没问题,因为它看起来不像 Zend\Db 跟踪事务状态。COMMIT
SET autocommit=...
做交易有两件事。
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 日志中的每个查询之前看到连接号。所有事务查询中的连接号必须相同。
我使用 beginTransaction
,rollback
和commit
在控制器中。
我在不同模型上执行了许多事务,其中我使用预定义的函数而没有任何控制事务(单个数据库事务不需要)。
使用 会在方法$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();
希望对解决问题有用。