2009-07-05 48 views
12

我在Zend Framework中使用以下代碼進行事務處理,但回滾函數不起作用(通過insertSome($ data)將數據插入到數據庫中)。 有什麼問題?無法在Zend Framework中回滾事務

  $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

是你的數據庫MySQL使用MyISAM表嗎?他們不支持交易。如果你想要交易支持,你必須使用InnoDB表。 – nos 2009-07-05 11:29:21

回答

20

我們不能從StackOverflow上的「未回答」問題列表中找出這個問題,除非至少有一個答案用upvote。所以我重複了上面在評論中討論的解決方案。

@nos提示:

是您的DB通過使用 MyISAM表任何機會的MySQL?他們不支持 交易。如果您希望支持交易 ,則必須使用InnoDB 表。

@Billy迴應:

是的,我使用的MyISAM表。我已經更改爲InnoDB表,它的工作原理。謝謝。

(我已將此作爲一個社會維基答案,所以我不從中獲得任何積分。)

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 

這是單元測試的一部分:我有一個啓動TRANSATION一個設置方法:

protected function setUp() 
{ 
    global $db; 

    $db->beginTransaction(); 

    // Insert this tested object into db. 
} 

和推倒方法應該確保該行未插入到數據庫(每個在這個測試類中運行一次測試,它會執行setUp/tearDown對,所以我不希望填充我的數據庫表的重複項)。

protected function tearDown() 
{ 
    global $db; 

    $db->rollBack(); 
} 

我已經檢查執行什麼SQL,我可以看到在事務開始時自動提交設置爲false,並回滾之後切換到真實的,但該行仍插。

0

您的代碼沒問題。

檢查您的表格選項。您需要使用InnoDb的Transacctional引擎

2

爲了將來的使用,要知道它是否真的是數據庫異常,請改用Zend_Db_Exception。

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