无法在Zend Framework中回滚事务

时间:2009-07-05 11:06:22

标签: mysql zend-framework transactions

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

4 个答案:

答案 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引擎