我用下面的代码交易Zend框架,但回滚功能不起作用(数据由insertSome($数据)插入到数据库)。 怎么了?
$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();
}
我们不能把这个问题出在计算器上“悬而未决”问题清单的,除非有至少一个答案与给予好评。 所以我重复您在评论上述讨论的解决方案。
@nos建议:
是您的DB通过使用MyISAM表任何机会的MySQL? 他们不支持事务。 你必须,如果你想事务支持使用InnoDB表。
@Billy回应:
是的,我使用的MyISAM表。 我已经改变了对InnoDB表和它的作品。 谢谢。
(我已将此作为一个社会维基答案,所以我不从中获得任何积分。)
对于今后的使用,要知道,如果它是一个真正的DB异常,使用Zend_Db_Exception代替。
} catch (Zend_Db_Exception $e) {
$db->rollBack();
echo $e->getMessage();
} catch (Exception $e) {
echo $e->getMessage();
}
如果我的表是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
这是单元测试的一部分:我有一个启动TRANSATION一个设置方法:
protected function setUp()
{
global $db;
$db->beginTransaction();
// Insert this tested object into db.
}
并应确保该行未插入到数据库(每次测试在这个测试类运行时间推倒方法,执行Setup /拆卸对,所以我不希望,填补了我的db表副本)。
protected function tearDown()
{
global $db;
$db->rollBack();
}
我已经检查执行什么SQL,我可以看到在事务开始时自动提交设置为false,并回滚之后切换到真实的,但该行仍插。
您的代码就可以了。
检查表选项。 你需要使用Transacctional引擎InnoDB的