我在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();
}
答案 0 :(得分:19)
除非至少有一个带有upvote的答案,否则我们无法从StackOverflow上的“未答复”问题列表中获取此问题。所以我正在重复你在评论中讨论过的解决方案。
@nos建议:
你的数据库是否是MySQL使用的任何机会 MyISAM表?他们不支持 交易。你必须使用InnoDB 表格,如果你想要交易 支持。
@Billy回复:
是的,我正在使用MyISAM表。我已经改为InnoDB表,它可以工作。感谢。
(我已将此标记为社区维基回答,因此我不会从中获得任何积分。)
答案 1 :(得分:3)
为了将来使用,要知道它是否真的是数据库异常,请改用Zend_Db_Exception。
} catch (Zend_Db_Exception $e) {
$db->rollBack();
echo $e->getMessage();
} catch (Exception $e) {
echo $e->getMessage();
}
答案 2 :(得分:2)
如果我的表是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,但行仍然插入。
答案 3 :(得分:0)
您的代码没问题。
检查您的表格选项。您需要使用InnoDb的Transacctional引擎