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 框架中无法回滚事务的主要内容,如果未能解决你的问题,请参考以下文章

Flask-SQLAlchemy:在回滚无效事务之前无法重新连接

spring事务会导致全局变量回滚么

事务无法在 codeigniter 中回滚

mysqli事务在insert失败时无法回滚

SQL Server 2005 - 无法回滚嵌套事务

事务配置在applicationContext.xml文件中不起作用,控制不了异常回滚