【问题标题】:Cannot rollback transaction in Zend FrameworkZend 框架中无法回滚事务
【发布时间】: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 表并且它可以工作。谢谢。

标签: mysql zend-framework transactions


【解决方案1】:

我们无法从 StackOverflow 上的“未回答”问题列表中删除此问题,除非至少有一个答案得到支持。所以我重复你上面在 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 引擎

        【讨论】:

          猜你喜欢
          • 2010-12-17
          • 2012-09-03
          • 2012-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多