1

これは私のコードです:

$transaction = Yii::app()->db->beginTransaction();
            try {
                $tModel->save();
                $activationLink = new ActivationLink;
                $activationLink->User_id = $tModel->id;
                $activationLink->hash1   = User::generateHashCode(100);
                $activationLink->hash2   = User::generateHashCode();
                $activationLink->hash3   = User::generateHashCode();
                $activationLink->time    = time();
                $activationLink->save();                    
                User::sendActivatonLink($tModel->mail,$activationLink->id, $activationLink->hash1, $activationLink->hash2, $activationLink->hash3);
                $transaction->commit();
                $this->redirect(array('view', 'id' => $tModel->id));
            } catch (Exception $e) {
                $transaction->rollback();
                Yii::app()->user->setFlash('error', "{$e->getMessage()}");
                $this->refresh();
            }

$tModel保存されてい$activationLinkませんが、ロールバックする必要があります。しかし、そうではありませんでした。なぜですか?

4

2 に答える 2

8

検証だけが失敗した場合、Yii save()は例外をスローしません。したがって、save()の結果を自分で確認する必要があります。

if (!$model->save())
   $transaction->rollback();

//or:

if (!$model->save())
   throw new Exception("This will trigger my catch statement block");
于 2012-12-10T13:48:17.157 に答える
1

innodb を使用していないと思われる mysql エンジンを確認してください。トランザクションを実行するには、innodb を使用する必要があります。テーブルのタイプ/エンジンを教えてください。

または、ログのエラーを理解するためにコードを追加する必要もあります。

新しい例外 ($e) をスローします。

于 2012-12-09T18:06:10.000 に答える