Zend 框架中无法回滚事务
Posted
技术标签:
【中文标题】Zend 框架中无法回滚事务【英文标题】:Cannot rollback transaction in Zend Framework 【发布时间】:2009-07-05 11:06:21 【问题描述】:我在 Zend Framework 中使用以下代码进行事务处理,但回滚功能不起作用(数据通过 insertSome($data) 插入到数据库中)。 怎么了?
$db->beginTransaction();
try
$model->insertSome($data);
$model->insertAll($data2); //this line cannot be run and the whole transaction should be rolled back.
$db->commit();
catch (Exception $e)
$db->rollBack();
echo $e->getMessage();
【问题讨论】:
你的数据库有没有机会 mysql 使用 MyISAM 表?他们不支持交易。如果您需要事务支持,则必须使用 InnoDB 表。 是的,我正在使用 MyISAM 表。我已更改为 InnoDB 表并且它可以工作。谢谢。 【参考方案1】:我们无法从 *** 上的“未回答”问题列表中删除此问题,除非至少有一个答案得到支持。所以我重复你上面在 cmets 中讨论的解决方案。
@nos 建议:
你的数据库是否有机会使用 MySQL MyISAM 表?他们不支持 交易。你必须使用 InnoDB 如果你想要交易表 支持。
@Billy 回复:
是的,我正在使用 MyISAM 表。我已更改为 InnoDB 表并且它可以工作。谢谢。
(我已将此标记为社区 wiki 答案,因此我没有从中获得任何积分。)
【讨论】:
【参考方案2】:为了将来使用,要知道它是否真的是一个 DB Exception,请改用 Zend_Db_Exception。
catch (Zend_Db_Exception $e)
$db->rollBack();
echo $e->getMessage();
catch (Exception $e)
echo $e->getMessage();
【讨论】:
【参考方案3】:如果我的表是 InnoDB,(从 SHOW CREATE TABLE xxx
看到)并且我的事务没有回滚,你有什么建议?
CREATE TABLE `EarningCode` (
`ID` int(11) NOT NULL auto_increment,
`EarningCode` varchar(16) collate utf8_unicode_ci NOT NULL,
`Description` varchar(255) collate utf8_unicode_ci NOT NULL,
`DateEffective` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`Rate` float NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1239 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
它是单元测试的一部分:我有一个启动交易的设置方法:
protected function setUp()
global $db;
$db->beginTransaction();
// Insert this tested object into db.
以及一个应确保该行未插入到数据库中的拆卸方法(每次在此测试类中运行测试时,它都会执行 setUp/tearDown 对,因此我不希望重复填充我的数据库表)。
protected function tearDown()
global $db;
$db->rollBack();
我查看了执行的是什么SQL,可以看到启动事务时autocommit设置为false,回滚后切换为true,但行仍然插入。
【讨论】:
【参考方案4】:您的代码没问题。
检查您的餐桌选项。您需要使用带有 InnoDb 的 Transacctional 引擎
【讨论】:
以上是关于Zend 框架中无法回滚事务的主要内容,如果未能解决你的问题,请参考以下文章