Zend框架中无法恢复交易(Cannot rollback transaction in Zend

2019-09-17 16:01发布

我用下面的代码交易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();
            }

Answer 1:

我们不能把这个问题出在计算器上“悬而未决”问题清单的,除非有至少一个答案与给予好评。 所以我重复您在评论上述讨论的解决方案。

@nos建议:

是您的DB通过使用MyISAM表任何机会的MySQL? 他们不支持事务。 你必须,如果你想事务支持使用InnoDB表。

@Billy回应:

是的,我使用的MyISAM表。 我已经改变了对InnoDB表和它的作品。 谢谢。

(我已将此作为一个社会维基答案,所以我不从中获得任何积分。)



Answer 2:

对于今后的使用,要知道,如果它是一个真正的DB异常,使用Zend_Db_Exception代替。

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


Answer 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

这是单元测试的一部分:我有一个启动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,并回滚之后切换到真实的,但该行仍插。



Answer 4:

您的代码就可以了。

检查表选项。 你需要使用Transacctional引擎InnoDB的



文章来源: Cannot rollback transaction in Zend Framework