2009-07-05 9 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

あなたのDBはMyISAMテーブルを使用していますか?彼らはトランザクションをサポートしていません。トランザクションサポートが必要な場合は、InnoDBテーブルを使用する必要があります。 – nos

+0

はい、私はMyISAMテーブルを使用しています。 InnoDBテーブルに変更しました。ありがとう。 – Billy

答えて

20

upvoteを有する少なくとも一つの答えがない限り、我々はStackOverflowの上の「未回答」の質問のリストのうち、この質問を取得することはできません。だから私はコメントで上記の議論を繰り返している。

@nos示唆:

は MyISAMテーブルを使用して、万が一のMySQLであなたのDBですか?彼らは トランザクションをサポートしていません。トランザクション をサポートしたい場合は、InnoDB テーブルを使用する必要があります。

@Billyの応答:

はい、私はMyISAMテーブルを使用しています。私はInnoDBテーブルに変更して動作します。ありがとう。

(私はそれから任意のポイントを得ることはありませんので、私はコミュニティのwikiの答えとしてこれをマークした。)

2

私のテーブルはInnoDBは、(TABLE xxxをCREATE SHOWから見て)と私の取引だった場合ロールバックしていない、あなたは何を提案しますか?

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 

これはユニットテストの一部です:行は、DBに挿入されていないことを確認する必要があり

protected function setUp() 
{ 
    global $db; 

    $db->beginTransaction(); 

    // Insert this tested object into db. 
} 

と涙ダウン法(それぞれ:私はトランザクションの独立を開始する設定方法を有しますテストがこのテストクラスで実行されるときに、setUp/tearDownのペアが実行されるため、dbテーブルをいっぱいにする重複は必要ありません。

protected function tearDown() 
{ 
    global $db; 

    $db->rollBack(); 
} 

私が実行されたものをSQLがチェックしている、と私はその自動コミットが挿入トランザクションが開始されたときにfalseに設定され、ロールバックした後、trueに切り替えますが、行が残っていることがわかります。

0

コードは問題ありません。

テーブルオプションを確認してください。あなたはInnoDbでTransacctionalエンジンを使用する必要があります

2

今後の使用のために、本当にDB例外かどうかを知るためには、代わりにZend_Db_Exceptionを使用してください。

} catch (Zend_Db_Exception $e) { 
    $db->rollBack(); 
    echo $e->getMessage(); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
関連する問題