Zend Framework 中无法回滚事务

11

我在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();
            }

7
你的数据库是否使用了MyISAM表?它们不支持事务操作。如果需要事务支持,你需要使用InnoDB表。 - nos
是的,我正在使用MyISAM表。 我已经改成InnoDB表了,现在它可以工作了。谢谢。 - Billy
4个回答

19

除非有至少一个得到赞同的答案,否则我们无法将此问题从StackOverflow的“未回答”列表中删除。因此,我正在重复您在评论中讨论的解决方案。

@nos建议:

你的数据库是否使用MyISAM表的MySQL?它们不支持事务。如果您需要事务支持,您必须使用InnoDB表。

@Billy回应道:

是的,我正在使用MyISAM表。我已经更改为InnoDB表并且它起作用了。谢谢。

(我已将其标记为社区wiki答案,因此我不会从中获得任何积分。)


3

为了将来的使用,如果要确定是否真正出现了数据库异常,请使用Zend_Db_Exception。

} catch (Zend_Db_Exception $e) {
    $db->rollBack();
    echo $e->getMessage();
} catch (Exception $e) {
    echo $e->getMessage();
}

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,但是该行仍然被插入。

0

你的代码没问题。

检查一下你的表选项。你需要使用InnoDb事务引擎。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接